MFC单文档多视图分割
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MFC视图分割有两种方法,一种动态分割,一种静态分割。但是动态分割中,对于单文档只能对应于同一个类窗口,这里不适用所以不做过多研究,重点看静态分割的方法。
MFC中封装了CSplitterWnd类可用于视图的分割。
首先在CMainFrame类中添加CSplitterWnd的对象,然后重写CMainFrame 类的OnCreateClient函数,在该函数中进行视图的分割。
在OnCreateCinent函数中,先定义CRect rect,调用函数Getclient(&rect)用来获取主视图窗格的大小,然后调用CSplitterWnd的成员函数CreateStatic 函数来对视图进行分割,函数原型如下,
BOOL CreateStatic(
CWnd* pParentWnd, //父框架视图对象
int nRows, //行数
int nCols, //列数
DWORD dwStyle = WS_CHILD | WS_VISIBLE, //风格,可直接用默认
UINT nID = AFX_IDW_PANE_FIRST //此窗口的子窗口ID。如果这个分隔器窗口不是嵌套在另一个分隔器窗口中的,则这个ID可以是AFX_IDW_PANE_FIRSH。);
父框架视图对象为this表示第一次分割,这时只需定义要分割的行数和列数即可。如果已经产生了第一次分割,需要对子窗口进行再分割,则这时候pParentWnd为第一次用于分割的CSplitterWnd的对象指针,再新定义CSplitterWnd对象用于第二次分割,这时nID是要被分割的窗口ID,
m_wndSplitter1.IdFromRowCol(1, 0)。
在分割完窗口后,对分割完成的视图创建窗格,此时调用CSplitterWnd的CreateView函数,函数原型如下,
virtual BOOL CreateView(
int row, //要被创建的视图行
int col, //要被创建的视图列
CRuntimeClass* pViewClass, // RUNTIME_CLASS(窗格的类名)
SIZE sizeInit, //指定窗格的大小CSize(rect.Width()/3,
rect.Height()/2)
CCreateContext* pContext //pContext
);
窗格的类要事先定义完成。至此视图分割完成。但有时候大小不是我们想要的,这时后可以响应WM_SIZE消息的函数OnSize来实时改变窗格的大小,如下图所示。
同时,我们也可以让视图的框架根据屏幕的分辨率自动最大化显示,响应CMainFrame的OnGetMinMaxInfo函数,如下图,同时在PreCreateWindow函数中初始化cs.cx=0,cs.cy=0。