1. 程式人生 > >單文件mfc視窗分割

單文件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的判斷條件中少打了一個“!”,導致執行後總是彈出“建立文件失敗"的提示。)

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);
}
5、執行後介面效果圖如下,視窗被分割為一行兩列



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