现在的位置: 首页 > 综合 > 正文

窗口的拆分及多重视图MDI应用程序

2013年10月19日 ⁄ 综合 ⁄ 共 3536字 ⁄ 字号 评论关闭
 

拆分窗口
在运行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);
}

 

抱歉!评论已关闭.