拆分窗口
在运行AppWizard的第四步中选择Advanced选项,在Window Styles选项卡下选中Use Split Window,就可以产生拆分窗口的代码,在查看菜单下将多一个菜单项:分隔。
静态拆分
编辑BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT /*lpcs*/,
CCreateContext* pContext)函数如下,调用两个试图类,使拆分窗口包含两个窗格,水平拆分从窗口的顶部向下100个设备单位的地方开始。
VERIFY(m_wndSplitter.CreateStatic(this, 2, 1));
VERIFY(m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CStringView), CSize(100, 100), pContext));
VERIFY(m_wndSplitter.CreateView(1, 0, RUNTIME_CLASS(CHexView), CSize(100, 100),pContext));
return TRUE;
切换无拆分的视图类
1. 使视图类的构造函数为public
2. 编写CMainFrame类,在头文件中添加两项
private:
enum eview{STRING = 1, HEX = 2}; //用来标识视图(这里只有两个)
void SwithToView(eview nview);//用来从菜单项切换视图
void CMainFrame::SwithToView(eview nview)
{
CView* pOldActiveView = GetActiveView();
CView* pNewActiveView = (CView*)GetDlgItem(nview);
if (pNewActiveView == NULL)
{
switch(nview)
{
case STRING:
pNewActiveView = (CView*)new CStringView;
break;
case HEX:
pNewActiveView = (CView*)new CHexView;
break;
}
CCreateContext context;
context.m_pCurrentDoc = pOldActiveView->GetDocument();
pNewActiveView->Create(NULL, NULL, WS_BORDER,
CFrameWnd::rectDefault, this, nview, &context);
pNewActiveView->OnInitialUpdate();
}
SetActiveView(pNewActiveView);
pNewActiveView->ShowWindow(SW_SHOW);
pOldActiveView->ShowWindow(SW_HIDE);
pOldActiveView->SetDlgCtrlID(pOldActiveView
->GetRuntimeClass() == RUNTIME_CLASS(CStringView) ? STRING : HEX);
pNewActiveView->SetDlgCtrlID(AFX_IDW_PANE_FIRST);
RecalcLayout();
}
3. 在View菜单项中添加相应视图的菜单项,映射相关的命令处理函数更新命令UI处理程序到CMainFrame类
void CMainFrame::OnViewHexview()
{
// TODO: Add your command handler code here
SwithToView(HEX);
}
void CMainFrame::OnViewStringview()
{
// TODO: Add your command handler code here
SwithToView(STRING);
}
void CMainFrame::OnUpdateViewHexview(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(!GetActiveView()->IsKindOf(RUNTIME_CLASS(CHexView)));
}
void CMainFrame::OnUpdateViewStringview(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(!GetActiveView()->IsKindOf(RUNTIME_CLASS(CStringView)));
}
多个视图类MDI
应用程序
用AppWizard产生的普通MDI应用程序,只有一个试图类,我们需要将第二个(或更多)试图类添加到工程中。
步骤:
1. 在应用程序类中为新的试图类添加数据成员和函数原型。
public:
CMultiDocTemplate* m_pTemplateHex;
在InitInstance()AddDocTemplate函数后立即插入代码(辅助模板):
m_pTemplateHex = new CMultiDocTemplate(
IDR_MY20DTYPE,
RUNTIME_CLASS(CPoemDoc),
RUNTIME_CLASS(CChildFrame),
RUNTIME_CLASS(CHexView));// CHexView是新类的类名
并在ExitInstance() 函数中添加删除辅助模板:
delete m_pTemplateHex;
2. 在IDR_MY20DTYPE菜单资源中添加新的菜单项并映射相应的消息处理函数,这里是
New Hex Window
ID_WINDOW_NEW_HEX 及相应的消息处理函数:
void CMainFrame::OnWindowNewHex()
{
// TODO: Add your command handler code here
CMDIChildWnd* pActiveChild = MDIGetActive();
CDocument* pDocument;
if (pActiveChild == NULL ||
(pDocument = pActiveChild->GetActiveDocument()) == NULL)
{
AfxMessageBox(AFX_IDP_COMMAND_FAILURE);
return;
}
CDocTemplate* pTemplate = ((CMy20dApp*)AfxGetApp())->m_pTemplateHex;
ASSERT_VALID(pTemplate);
CFrameWnd* pFrame = pTemplate->CreateNewFrame(pDocument, pActiveChild);
if (pFrame == NULL)
{
AfxMessageBox(AFX_IDP_COMMAND_FAILURE);
return;
}
pTemplate->InitialUpdateFrame(pFrame, pDocument);
}