使用VC實現窗口的任意分割
南京郵政局計算機中心 張中慶
一關於CSplitterWnd類
我們在使用CuteFtp或者NetAnt等工具的時候一般都會被其復雜的界面所吸引在這些界面中窗口被分割為若干的區域真正做到了窗口的任意分割 那麼我們自己如何創建類似的界面也實現窗口的任意的分割呢 ?在VC中這就需要使用到CSplitterWnd類CSplitterWnd看上去像是一種特殊的框架窗口每個窗口都被相同的或者不同的視圖所填充當窗口被切分後用戶可以使用鼠標移動切分條來調整窗口的相對尺寸雖然VC支持從AppWizard中創建分割窗口但是自動加入的分割條總是不能讓我們滿意因此我們還是通過手工增加代碼來熟悉這個類
CSplitterWnd的構造函數主要包括下面三個
BOOL Create(CWnd* pParentWndint nMaxRowsint nMaxColsSIZE sizeMinCCreateContext* pContextDWORD dwStyleUINT nID);
功能描述
該函數用來創建動態切分窗口
參數含義
pParentWnd 切分窗口的父框架窗口
nMaxRows
nMaxCols是創建的最大的列數和行數
sizeMin是窗格的現實大小
pContext 大多數情況下傳給父窗口
nID是字窗口的ID號
BOOL CreateStatic(CWnd* pParentWndint nRowsint nColsDWORD dwStyleUINT nID)
功能描述
用來創建切分窗口
參數含義同上
BOOL CreateView (int rowint colCruntimeClass* pViewClassSIZE sizeinitCcreateContext* pContext);
功能描述
為靜態切分的窗口的網格填充視圖
在將視圖於切分窗口聯系在一起的時候必 須先將切分窗口創建好
參數含義
同上
從CSplitterWnd源程序可以看出不管是使用動態創建Create還是使用靜態創建CreateStatic
在函數中都調用了一個保護函數CreateCommon
從下面的CreateCommon函數中的關鍵代碼可以看出創建CSplitterWnd的實質是創建了一系列的MDI子窗口
DWORD dwCreateStyle = dwStyle & ~(WS_HSCROLL|WS_VSCROLL);if (afxDatabWin) dwCreateStyle &= ~WS_BORDER; //create with the same wndclass as MDIFrame (no erase bkgnd) if (!CreateEx( _afxWndMDIFrame NULL dwCreateStyle pParentWnd>m_hWnd (HMENU)nID NULL)) return FALSE; // create invisible
二創建嵌套分割窗口 創建動態分割窗口 動態分割窗口使用Create方法
下面的代碼將創建
x
的窗格
m_wndSplitterCreate(thisCSize()pContext);
但是動態創建的分割窗口的窗格數目不能超過
x
而且對於所有的窗格
都必須共享同一個視圖
所受的限制也比較多
因此我們不將動態創建作為重點
我們的主要精力放在靜態分割窗口的創建上
創建靜態分割窗口 與動態創建相比
靜態創建的代碼要簡單許多
而且可以最多創建
x
的窗格
不同的窗格我們可以使用CreateView填充不同的視圖
在這裡我們將創建CuteFtp的窗口分割
CuteFtp的分割情況如下
CCuteFTPView
CView
CView
From:http://tw.wingwit.com/Article/program/c/201401/30255.html