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
杨彬彬 阅读(834)
评论(0) 编辑 收藏 引用