單文件mfc視窗分割
說明:第一次發表部落格,全當為自己學習做個記錄,將自己的學習新東西和bug整理記錄,方便自己日後的學習。內容有借鑑別人的地方,結尾均附上別人的連結。
1、新建單文件專案,生成如下幾個類
2、在mainFrm。h檔案中新增如下程式碼
CSplitterWnd m_splitwnd1;
CSplitterWnd m_splitwnd2;
3、插入對話方塊CFORMVIEW對話方塊,新增類Csplitwnd_R,基類選擇cformview;
在mainfrm中包含標頭檔案:
#include "Csplitwnd_R.h" //右邊插入的子視窗的類h檔案
#include "ex1Doc.h" //單文件專案生成的“***doc.h"和”***view.h"
#include "ex1View.h"
4、mainfrm中過載oncreatclient函式,可以在mainfrm類屬性中新增,也可以在類嚮導中新增虛擬函式新增。
(由於第一次嘗試的時候在IF的判斷條件中少打了一個“!”,導致執行後總是彈出“建立文件失敗"的提示。)
5、執行後介面效果圖如下,視窗被分割為一行兩列BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) { // TODO: 在此新增專用程式碼和/或呼叫基類 //**********************************************************// // 過載cmainfrm的oncreatClient函式 // // 將視窗進行分割 // //**********************************************************// CRect Clirect; GetClientRect(&Clirect); //分割視窗為一行兩列 if(!m_splitwnd1.CreateStatic(this,1,2)) { return FALSE; } if(!m_splitwnd1.CreateView(0, 0, RUNTIME_CLASS(Cex1View),CSize(Clirect.Width()/2, Clirect.Height()), pContext)) return FALSE; if(!m_splitwnd1.CreateView(0,1,RUNTIME_CLASS(Csplitwnd_R),CSize(Clirect.Width()/2,Clirect.Height()),pContext)) return FALSE; return true; //return CFrameWndEx::OnCreateClient(lpcs, pContext); }
6、注意
在第4步中,必須為每一個子視窗都關聯子類,否則會報錯
此時我們注意到生成視窗左上角標題顯示“無標題”,怎麼更改?
只需要在mainfrm中找到precreatwindow,新增標題;
//改變標題
cs.style &=~FWS_ADDTOTITLE;
cs.lpszName="分割視窗";
7、繼續分割右邊分割好的視窗
再次分割子視窗,就需要用到第二個分割條物件CSplitterWnd m_splitwnd2;
然後在cmainfrm.cpp中的oncreatclient中新增程式碼。
(第一個分割條把視窗分為一行兩列,為左邊子視窗關聯類後,繼續為右邊子視窗進行分割,然後再為兩個子視窗分別關聯類)
其中m_splitwnd2.CreateStatic(&m_splitwnd1, 2, 1, WS_VISIBLE|WS_CHILD, m_splitwnd1.IdFromRowCol(0,1))的
第一個引數為上一個分割物件地址,後邊是把子視窗要分割行數和列數,最後一個引數是選擇上一次分割得到的子視窗。
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
// TODO: 在此新增專用程式碼和/或呼叫基類
//**********************************************************//
// 過載cmainfrm的oncreatClient函式 //
// 將視窗進行分割 //
//**********************************************************//
CRect Clirect;
GetClientRect(&Clirect);
//分割視窗為一行兩列
if(!m_splitwnd1.CreateStatic(this,1,2))
{
return FALSE;
}
if(!m_splitwnd1.CreateView(0, 0, RUNTIME_CLASS(Cex1View),CSize(Clirect.Width()/2, Clirect.Height()), pContext))
return FALSE;
//if(!m_splitwnd1.CreateView(0,1,RUNTIME_CLASS(Csplitwnd_R),CSize(Clirect.Width()/2,Clirect.Height()),pContext))
// return FALSE;
if (!m_splitwnd2.CreateStatic(&m_splitwnd1, 2, 1, WS_VISIBLE|WS_CHILD, m_splitwnd1.IdFromRowCol(0,1)))
{
//MessageBox(_T("子視窗分割視窗錯誤"), _T("Error"), MB_OK | MB_ICONERROR);
return false;
}
if(!m_splitwnd2.CreateView(0, 0, RUNTIME_CLASS(Cex1View),CSize(Clirect.Width()/2, Clirect.Height()/2), pContext))
return FALSE;
if(!m_splitwnd2.CreateView(1, 0, RUNTIME_CLASS(Csplitwnd_R),CSize(Clirect.Width()/2, Clirect.Height()/2), pContext))
return FALSE;
m_splitwnd2.SetActivePane(1, 0);//用分割條選擇一個分割好的視窗設定選中狀態
return true;
//return CFrameWndEx::OnCreateClient(lpcs, pContext);
}
為每一個子視窗都繫結一個子類,能夠避免一些意外問題的發生
8、參考部落格
http://blog.csdn.net/wf6892/article/details/52423446
http://blog.csdn.net/m_buddy/article/details/50803102
http://blog.csdn.net/m_buddy/article/details/50803102