【數字圖像處理】 二.MFC單文檔分割窗口顯示圖片
本文是講述《數字圖像處理》係列文章,繼上篇講述BMP格式圖片和顯示後,該篇講述如何對單文檔進行分割.主要是采用CSplitterWnd靜態分割窗口顯示圖片等相關知識.本文主要結合自己的課程及常用圖片軟件講解.
一. CSplitterWnd靜態分割窗口
1.CSplitterWnd類基礎知識
(該部分引用:百度百科和麥田裏的稻草人博客)
CSplitterWnd類提供一個分離器窗口的功能,分隔器窗口是一個包含有多個窗格的窗口.窗格通常是應用程序特定的由CView派生的對象,但它也可以是具有適當子窗口ID的任何CWnd對象.
CSplitterWnd::Create BOOL Create( CWnd* pParentWnd, int nMaxRows, int nMaxCols, SIZE sizeMin, CCreateContext* pContext, DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL | SPLS_DYNAMIC_SPLIT, UINT nID = AFX_IDW_PANE_FIRST );
Create:創建一個動態的分隔器窗口並將它與一個CSplitterWnd對象連接.參數:
pParentWnd表示切分窗口的父框架窗口;
nMaxRows,nMaxCols是創建切分窗口的最大列數和行數(動態創建的分割窗口的窗格數目不能超過2x2);
sizeMin指出顯示一個窗格所需的最小尺寸;
pContext指向一個CCreateContext結構的指針(多數情況這個值可以是傳遞給父框架窗口的pContext);
dwStyle指定窗口的風格;
nID此窗口的子窗口ID(如果分隔器窗口不是嵌套另一分隔器窗口中,則ID可以是AFX_IDW_PANE_FIRST).
CSplitterWnd::CreateStatic BOOL CreateStatic( CWnd* pParentWnd, int nRows, int nCols, DWORD dwStyle = WS_CHILD | WS_VISIBLE, UINT nID = AFX_IDW_PANE_FIRST );
CreateStatic:創建一個靜態的分隔器窗口並將它與一個CSplitterWnd對象連接.參數:
pParentWnd表示切分窗口的父框架窗口;
nRows行數.該值不能超過16;
nCols列數.這個值必須不超過16;
dwStyle指定窗口的風格;
nID此窗口的子窗口ID(如果分隔器窗口不是嵌套另一分隔器窗口中,則ID可以是AFX_IDW_PANE_FIRST).
CSplitterWnd::CreateView virtual BOOL CreateView( int row, int col, CRuntimeClass* pViewClass, SIZE sizeInit, CCreateContext* pContext );
CreateView:在一個分隔器窗口中創建一個窗格.參數:
row指定用來放置新視的分隔器窗口行;
col指定用來放置新視的分隔器窗口列(最多創建16*16窗口);
pViewClass指定新視的CRuntimeClass;
sizeInit指定新視的初始尺寸;
pContext 指向用來創建此視的創建環境的指針(該pContext被傳遞給創建此分隔器窗口的父框架的重載的OnCreateClient成員函數).
2.CSplitterWnd類創建靜態分割窗口
(1).創建MFC單文檔工程應用程序,工程名稱"MFCPic".
(2).向CMainFrame類中添加一個公有成員變量,類型為CSplitterWnd,變量名為m_wndSplitter.在"類視圖"右鍵"CMainFrame",選擇"添加"->"添加變量".
(3).利用"類向導"為CMainFrame類添加OnCreateClient事件."項目"->"類向導"如下圖選擇"CMainFrame"類,添加虛函數OnCreateClient.
添加代碼如下,同時向CMainFrame.cpp中添加#include "MFCPicView.h",向MFCPicView.h中添加#include "MFCPicDoc.h",否則會出現"XXXDoc missing ';' before '*'"錯誤提示:
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) { // TODO: 在此添加專用代碼和/或調用基類 CRect rect; GetClientRect(&rect); //獲取客戶區坐標(左上 右下) if(!m_wndSplitter.CreateStatic(this,1,2)) return FALSE; //創建靜態分割器窗口 1行*2列 if(!m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CMFCPicView),CSize(450,250),pContext)) return FALSE; //創建位置(0,0) if(!m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CMFCPicView),CSize(rect.Width()/4,rect.Height()),pContext)) return FALSE; //創建位置(0,1) SetActiveView((CMFCPicView*)m_wndSplitter.GetPane(0,0)); return TRUE; //return CFrameWndEx::OnCreateClient(lpcs, pContext); }
(4).可以設置RUNTIME_CLASS為自定義的類.如可以實現左邊是帶有按鈕的窗口,右邊是操作後顯示的圖片."項目"->"新建類"為工程添加一個新類,在Class type中選擇MFC class,在對話框Name中輸入"CRightView",並在Base class(基類)下拉列表中自定義設置為CEditView,同時修改第二個窗格的代碼修改如下:
m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CRightView),CSize(250,250),pContext))
同時,向CMainFrame源文件中添加#include "RightView.h".我把該上述代碼類似的嵌入至"【數字圖像處理】 一.MFC詳解顯示BMP格式圖片"中運行結果如下圖所示:
a.單文檔分割成多個窗口並設置分割線的文章https://blog.csdn.net/ziren235/article/details/1381652
b.MFC靜態分割窗口帶資源的文章https://blog.csdn.net/guoguojune/article/details/8586750
二. 閑話
PS:由於在完成該程序時VS2012在編譯時總是提示錯誤:"error MSB6006:'cl.exe' exited with code 2",code 1是漢字問題,但code 2可能是路徑環境被破壞.查找到相應位置Microsoft.CppCommon.targets的代碼是"<CL Condition="'%(ClCompile.PrecompiledHeader)'..."同時還提示"error
LINK1158:無法運行 'rc.exe'|'link.exe'|'ml.exe'".在網上查找baidu.google.msdn等都沒有很好的解決方案,而且運行"vs2012\VC\bin"下的cl.exe會提示缺少dll,下載也沒有用;重新修複或安裝VS2012都不能修複該錯誤,真心無語.但是C#工程可以運行,就是MFC不能運行.
它耗費了我大量時間,最後我決定放棄,準備裝VC 6.0來完成MFC項目,但在安裝它時又由於兼容問題,程序總是未響應,也不能安裝.但是再次運行VS2012時上麵的error MSB6006等問題被解決了,VS2012的MFC又能運行了.我懷疑可能由於在安裝VC 6.0時修複了其中文件環境路徑問題,百思不得其解???
希望該文章能夠對大家有所幫助,同時如果文章中有錯誤或不足之處,還請大家海涵.後麵講述的"左邊顯示樹狀圖片路徑,右邊顯示圖片"和"顯示圖片路徑中的文件"可能對大家幫助更大,此篇僅是開篇.
(By:Eastmount 2014-2-12 夜2點 原創:https://blog.csdn.net/eastmount)
最後更新:2017-04-03 12:55:01