Win32 框架文档视图(2)
2011-04-03 16:31 Clingingboy 阅读(942) 评论(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();
}
5.16 如何在SDI中切换多视图
- 使用GetActiveView方法查找当前View
- 查找想要转换的View,如果没有则创建一个
- 使用SetActiveView方法设置当前活动视图
- 显示新视图,隐藏旧视图
- 调用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的应用
5.18 如何在SDI中静态切分窗口
同上,所谓静态切分就是说初始化时就有切分功能.
这些东西实际上都已经很落后,不管WinForm还是WPF,DOCKING && MDI都做的比这个好,而且简单.只不过MDI在MFC中属于内置的而已,了解下就好