Win32 框架文档视图(2)

来源:互联网 发布:淘宝店铺装修网站 编辑:程序博客网 时间:2024/06/06 07:13

5.10 如何删除SDI框架窗口中的菜单

DestroyMenu

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs){    if( !CFrameWnd::PreCreateWindow(cs) )        return FALSE;    if (cs.hMenu != NULL)    {         //删除菜单        DestroyMenu(cs.hMenu);        //设置菜单句柄值为NULL        cs.hMenu = NULL;    }    return TRUE;}

 

5.11 如何删除MDI框架窗口中的菜单

同上方法

5.12 如何改变视图的背景颜色

在OnEraseBkgnd事件中填充

BOOL CDemoView::OnEraseBkgnd(CDC* pDC) {    //获得客户区大小    CRect rect;    GetClientRect(rect);    //填充背景    pDC->FillRect(&rect, &m_Brush);    return TRUE;}

 

5.13 如何改变MDI主框架窗口的背景颜色

同上方法

5.14 如何使MDI启动时不生成新的子窗口

设置CCommandLineInfo的m_nShellCommand 字段

CCommandLineInfo cmdInfo;ParseCommandLine(cmdInfo);cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing;

 

5.15 如何排列MDI子框架窗口

MDITile和MDICascade方法

void CMainFrame::OnTilehWnd() {    //水平显示    MDITile(MDITILE_HORIZONTAL);    }void CMainFrame::OnTilevWnd() {    //垂直显示    MDITile(MDITILE_VERTICAL);}void CMainFrame::OnCascadeWnd() {    //层叠显示    MDICascade();}

image

 

5.16 如何在SDI中切换多视图

  1. 使用GetActiveView方法查找当前View
  2. 查找想要转换的View,如果没有则创建一个
  3. 使用SetActiveView方法设置当前活动视图
  4. 显示新视图,隐藏旧视图
  5. 调用RecalcLayout方法重新布局
void CMainFrame::SwitchView(int nView){    //获得旧视图(活动视图)指针    CView* pOldView = GetActiveView();    //获得新视图指针    CView* pNewView = (CView*)GetDlgItem(nView);    if (pNewView == NULL)    {        if (nView == 1)        {            pNewView = new CDemoView1();        }        else if (nView == 2)        {            pNewView = new CDemoView2();        }        else        {            return;        }        CCreateContext context;        context.m_pCurrentDoc = pOldView->GetDocument();        //创建新视图        pNewView->Create(NULL, NULL, WS_BORDER, CFrameWnd::rectDefault,             this, nView, &context);                pNewView->OnInitialUpdate();    }    //设置新视图为活动视图    SetActiveView(pNewView);    //显示新视图    pNewView->ShowWindow(SW_NORMAL);        //隐藏旧视图    pOldView->ShowWindow(SW_HIDE);    //设置旧视图ID    if (pOldView->GetRuntimeClass() == RUNTIME_CLASS(CDemoView1))    {        pOldView->SetDlgCtrlID(1);    }    else if (pOldView->GetRuntimeClass() == RUNTIME_CLASS(CDemoView2))    {        pOldView->SetDlgCtrlID(2);    }    //设置新视图ID    pNewView->SetDlgCtrlID(AFX_IDW_PANE_FIRST);    //重新布局    RecalcLayout();                                        }void CMainFrame::OnSwitchView1() {    SwitchView(1);}void CMainFrame::OnUpdateSwitchView1(CCmdUI* pCmdUI) {    if (GetActiveView()->IsKindOf(RUNTIME_CLASS(CDemoView1)))    {        pCmdUI->Enable(FALSE);    }    else    {        pCmdUI->Enable(TRUE);    }}void CMainFrame::OnSwitchView2() {    SwitchView(2);}void CMainFrame::OnUpdateSwitchView2(CCmdUI* pCmdUI) {    if (GetActiveView()->IsKindOf(RUNTIME_CLASS(CDemoView2)))    {        pCmdUI->Enable(FALSE);    }    else    {        pCmdUI->Enable(TRUE);    }}

 

5.17 如何在SDI中动态切分窗口

即CSplitterWnd的应用

image

5.18 如何在SDI中静态切分窗口

同上,所谓静态切分就是说初始化时就有切分功能.

这些东西实际上都已经很落后,不管WinForm还是WPF,DOCKING && MDI都做的比这个好,而且简单.只不过MDI在MFC中属于内置的而已,了解下就好

0 0
原创粉丝点击