在 MFC MDI 程序中拆分子窗口
Posted
技术标签:
【中文标题】在 MFC MDI 程序中拆分子窗口【英文标题】:Splitting Child Window in MFC MDI Program 【发布时间】:2011-03-29 11:07:45 【问题描述】:我正在尝试拆分我正在处理但遇到一些问题的 MFC MDI 程序的子窗口。我知道我必须使用 CSplitterWnd 类,并且一直在尝试按照此处帖子中的说明进行操作:
Create multi views in a CChildFrame using CSplitterWnd
但似乎无法使其正常工作,谁能就这些说明向我提供一些建议,我有一些具体问题:
CRightView 也是 CView 的派生类吗?如果有的话应该放什么代码?
m_pLeftView、m_pRightView、m_pPhongView 和 m_pPhongInfo 都是相应类的变量吗?它们有什么特定类型吗?
CTreeView哪里来的,好像不是标准的基类?
CChildFrame::OnCreateClient 中的 rc.Width 给出了一个未声明的标识符错误,我应该在这里声明什么吗?
我会很感激任何关于这个的建议,真的很难让分离器工作。
谢谢
【问题讨论】:
【参考方案1】:经过几天的努力,我设法解决了自己的问题,我在这里为可能遇到相同问题的其他人添加了解决方案。
声明两个视图类,在我的例子中,CElement
View 是 CWnd
派生类,CSampleViewer3dView
是 CView
派生类。
在CChildFrame
中添加一个访问私有的变量,输入CSplitterWnd
并命名为m_wndSplitter
。
为CChildFrame
中的OnCreateClient
函数添加一个覆盖,这应该添加代码:
virtual BOOL OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext);
在 ChildFrm.h 中,您还应该在 ChildFrm.h 中添加一个布尔标志 m_bInitSplitter:
BOOL m_bInitSplitter;
您还必须添加:
m_bInitSplitter = false;
在 ChildFrm.cpp 的构造函数中,当您使用向导添加变量时,将以下代码添加到 ChildFrm.cpp:
BOOL CChildFrame::OnCreateClient(LPCREATESTRUCT /*lpcs*/, CCreateContext* pContext)
将以下代码放入CChildFrame::OnCreateClient:
BOOL CChildFrame::OnCreateClient(LPCREATESTRUCT /*lpcs*/, CCreateContext* pContext)
CRect cr;
GetWindowRect( &cr );
if (!m_wndSplitter.CreateStatic(this, 1, 2))
MessageBox("Error setting up splitter frames!", "Init Error!", MB_OK | MB_ICONERROR);
return FALSE;
if (!m_wndSplitter.CreateView( 0, 0, RUNTIME_CLASS(CElementView),
CSize(cr.Width()/2, cr.Height()), pContext ) )
MessageBox("Error setting up splitter frames!", "Init Error!", MB_OK | MB_ICONERROR);
return FALSE;
if (!m_wndSplitter.CreateView( 0, 1, RUNTIME_CLASS(CSampleViewer3dView),
CSize(cr.Width()/2, cr.Height()), pContext))
MessageBox("Error setting up splitter frames!", "Init Error!", MB_OK | MB_ICONERROR);
return FALSE;
m_bInitSplitter = TRUE;
return TRUE;
将WM_SIZE
消息的覆盖添加到CChildFrame
并插入以下代码:
void CChildFrame::OnSize(UINT nType, int cx, int cy)
CMDIChildWnd::OnSize(nType, cx, cy);
CRect cr;
GetWindowRect(&cr);
if (m_bInitSplitter && nType != SIZE_MINIMIZED)
m_wndSplitter.SetRowInfo( 0, cy, 0 );
m_wndSplitter.SetColumnInfo(0, cr.Width()*0.25 / 2, 50);
m_wndSplitter.SetColumnInfo(1, cr.Width()*0.75 / 2, 50);
m_wndSplitter.RecalcLayout();
您可以通过将值 0.25 和 0.75 更改为您希望每个视图占用的屏幕百分比来编辑每个窗口的大小。
-
将两个视图的头文件添加到
ChildFrm.cpp
,例如ElementView.h
和 SampleViewer3dView.h
。
您应该在 MDI 程序的子窗口中有两个独立的视图。
【讨论】:
由于某种原因,我无法让代码标签适用于某些代码,如果有人想整理它,请随意。以上是关于在 MFC MDI 程序中拆分子窗口的主要内容,如果未能解决你的问题,请参考以下文章
MFC项目组合:如何将没有文档类的SDI应用程序添加到MDI应用程序中?应该使用子窗口吗?[MFC]
MFC - 当最大化子窗口的标题很长时,MDI 主框架标题被截断
MFC/VC 在多文档MDI程序中 子窗口初始最大化显示 如何去掉菜单栏右侧的最小化及向下还原按钮