Win32 框架文档视图(2)
2011-04-03 16:31 Clingingboy 阅读(944) 评论(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中属于内置的而已,了解下就好
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
2009-04-03 c++ primer学习笔记(2)-c++基本数据类型
2009-04-03 c++ primer学习笔记(1)