MFC窗體分割及相關注意事項
1.首先從CsplitterWnd繼承一個子類CSplitterWndEx
2.在CMainFrame類中添加CsplitterWnd的實例CSplitterWndEx m_wndSplitter;
3.添加代碼到 CMainFrame::OnCreateClient()函數
CRect rect;
GetClientRect(rect);
if (!m_wndSplitter.CreateStatic(this,1,2)) { return FALSE; }
if (!m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CZYView),CSize(rect.Width()/4*3,100),pContext)) { return FALSE; }
if (!m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CTest),CSize(rect.Width()/4,100),pContext)) { return FALSE; }
m_CreatewndSplitter=true;
m_wndSplitter.SetActivePane(0,1);
return TRUE;
return CFrameWnd::OnCreateClient(lpcs, pContext);
4.。重載CMainFrame::OnSize()函數,在窗口大小改變是調整分割窗體的大小
CFrameWnd::OnSize(nType, cx, cy);
CRect rect;
GetClientRect(rect);
if(m_CreatewndSplitter)
{
m_wndSplitter.SetColumnInfo(0,rect.Width() *3/4,10);
m_wndSplitter.SetColumnInfo(1,rect.Width() *1/4,10);
m_wndSplitter.RecalcLayout();
}
5.可以屏蔽CSplitterWndEx的鼠標調整大小的操作,重載OnMouseMove函數
void CSplitterWndEx::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CWnd::OnMouseMove(nFlags, point);
}
-------------------------------------------------------------------------------------------------------
在分割窗體的一個視圖中調用另一個視圖的方法:
CZYView* pZYView;
CMainFrame * pMainFrm = (CMainFrame*)AfxGetMainWnd();
pZYView = (CZYView*)pMainFrm->m_wndSplitter.GetPane(0,0); /*獲取另一個視圖的指針*/
pZYView->Line(m_x0,m_y0,m_x1,m_y1);
----------------------------------------------------------------------------------------------------
注意事項:
在添加頭文件編譯后經常會產生莫名其妙的錯誤,改正方法如下:
如果產生如下錯誤:
error C2143: syntax error : missing ';' before '*....
error C2501: 'CMyDoc' : missing storage-class or type specifiers
error C2501: 'GetDocument' : missing storage-class or type specifiers
解決方法:
在任何cpp文件的開頭都按這樣的順序Include:
#include "XXXDoc.h"
#include "XXXView.h"
#include "MainFrm.h"
注意,Doc的頭文件一定要在最前面。這樣你的CDemoView和CMyView也可以共享一個CDemoDoc。
一般在Cpp中包含文件是要注意類的包含關系,被包含的類定義應該在前面。如果實在有沖突,可以在一個類的頭文件中加:class CXXXDoc;之類的空定義。這樣定義過的頭文件中可以用CXXXDoc申明指針,但是不能申明實際對象。
posted on 2008-11-24 11:10
楊彬彬 閱讀(841)
評論(0) 編輯 收藏 引用