代码改变世界

Win32 框架文档视图(2)

2011-04-03 16:31  Clingingboy  阅读(938)  评论(0编辑  收藏  举报

 

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中属于内置的而已,了解下就好