MFC中窗口静态分割&视图切换
窗口静态分割
单个分割器
声明
首先在MainFrm.h中声明分割对象
CSplitterWnd m_wndSplitter;
准备视图
从CView或其派生类中派生四个类:CMyView1、CMyView2、CMyView3、CMyView4
静态分割窗口&添加视图
在MainFrm.cpp中添加虚函数OnCreateClient,添加如下代码
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
// TODO: 在此添加专用代码和/或调用基类
CRect rectClient;
GetClientRect(&rectClient);
if (!m_wndSplitter.CreateStatic(this, 2, 2) ||
!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CListView), CSize(rectClient.Width() / 2, rectClient.Height() / 2), pContext) ||
!m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CListView), CSize(rectClient.Width() / 2, rectClient.Height() / 2), pContext) ||
!m_wndSplitter.CreateView(1, 0, RUNTIME_CLASS(CListView), CSize(rectClient.Width() / 2, rectClient.Height() / 2), pContext) ||
!m_wndSplitter.CreateView(1, 1, RUNTIME_CLASS(CListView), CSize(rectClient.Width() / 2, rectClient.Height() / 2), pContext))
return FALSE;
// return CFrameWnd::OnCreateClient(lpcs, pContext);
return TRUE;
}
使视图大小随窗口大小改变
在MainFrm.h中声明变量
BOOL m_bSplitter;
在MainFrm.cpp构造函数中初始化m_bSplitter
CMainFrame::CMainFrame() noexcept :
m_bSplitter(FALSE)
{
}
在MainFrm.cpp虚函数OnCreateClient窗口分割之后添加对m_bSplitter的赋值
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
// TODO: 在此添加专用代码和/或调用基类
CRect rectClient;
GetClientRect(&rectClient);
if (!m_wndSplitter.CreateStatic(this, 2, 2) ||
!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CListView), CSize(rectClient.Width() / 2, rectClient.Height() / 2), pContext) ||
!m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CListView), CSize(rectClient.Width() / 2, rectClient.Height() / 2), pContext) ||
!m_wndSplitter.CreateView(1, 0, RUNTIME_CLASS(CListView), CSize(rectClient.Width() / 2, rectClient.Height() / 2), pContext) ||
!m_wndSplitter.CreateView(1, 1, RUNTIME_CLASS(CListView), CSize(rectClient.Width() / 2, rectClient.Height() / 2), pContext))
return FALSE;
m_bSplitter = TRUE; // 窗口已完成分割,视图已经动态创建
// return CFrameWnd::OnCreateClient(lpcs, pContext);
return TRUE;
}
在MainFrm.cpp中添加WM_SIZE消息映射,添加如下代码
void CMainFrame::OnSize(UINT nType, int cx, int cy)
{
CFrameWnd::OnSize(nType, cx, cy);
// TODO: 在此处添加消息处理程序代码
if (m_bSplitter == TRUE)
{
m_wndSplitter.SetColumnInfo(0, cx / 2, 0);
// 另外一列将自适应宽度
m_wndSplitter.SetRowInfo(0, cy / 2, 0);
// 另外一行将自适应高度
// 重新计算
m_wndSplitter.RecalcLayout();
}
}
效果图

多个分割器
声明
声明两个分割器
CSplitterWnd m_wndSplitter1; // 主分割器
CSplitterWnd m_wndSplitter2; // 子分割器
静态分割窗口&添加视图
在MainFrm.cpp中修改虚函数OnCreateClient
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
// TODO: 在此添加专用代码和/或调用基类
CRect rectClient;
GetClientRect(&rectClient);
if (!m_wndSplitter1.CreateStatic(this, 2, 1) ||
!m_wndSplitter1.CreateView(0, 0, RUNTIME_CLASS(CListView), CSize(rectClient.Width(), rectClient.Height() / 2), pContext))
return FALSE;
if (!m_wndSplitter2.CreateStatic(&m_wndSplitter1, 1, 2, WS_CHILD | WS_VISIBLE, m_wndSplitter1.IdFromRowCol(1, 0)) ||
!m_wndSplitter2.CreateView(0, 0, RUNTIME_CLASS(CListView), CSize(rectClient.Width() / 2, rectClient.Height() / 2), pContext) ||
!m_wndSplitter2.CreateView(0, 1, RUNTIME_CLASS(CListView), CSize(rectClient.Width() / 2, rectClient.Height() / 2), pContext))
return FALSE;
m_bSplitter = TRUE; // 窗口已完成分割,视图已经动态创建
// return CFrameWnd::OnCreateClient(lpcs, pContext);
return TRUE;
}
使视图大小随窗口大小改变
相应地修改OnSize函数
void CMainFrame::OnSize(UINT nType, int cx, int cy)
{
CFrameWnd::OnSize(nType, cx, cy);
// TODO: 在此处添加消息处理程序代码
if (m_bSplitter == TRUE)
{
m_wndSplitter1.SetRowInfo(0, cy / 2, 0);
m_wndSplitter2.SetColumnInfo(0, cx / 2, 0);
// 重新计算
m_wndSplitter1.RecalcLayout();
m_wndSplitter2.RecalcLayout();
}
}
效果图

视图切换
在CMainFrame添加切换视图的函数BOOL CMainFrame::Switch(int nIndex),添加如下代码建立框架
BOOL CMainFrame::Switch(int nIndex)
{
switch (nIndex)
{
case 0:
break;
case 1:
break;
default:
return FALSE;
}
return TRUE;
}
视图之间的切换
声明
CSplitterWnd m_wndSplitter;
修改相应函数
添加CMyView2和CMyView3的绘图代码
CMyView2
void CMyView2::OnDraw(CDC* pDC)
{
CRect rectClient;
GetClientRect(rectClient);
pDC->FillSolidRect(rectClient, RGB(255, 255, 255));
}
CMyView3
void CMyView3::OnDraw(CDC* pDC)
{
CRect rectClient;
GetClientRect(rectClient);
pDC->FillSolidRect(rectClient, RGB(0, 0, 0));
}
修改OnCreateClient函数
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
// TODO: 在此添加专用代码和/或调用基类
CRect rectClient;
GetClientRect(&rectClient);
if (!m_wndSplitter.CreateStatic(this, 1, 2) ||
!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CMyView1), CSize(rectClient.Width() / 2, rectClient.Height()), pContext) ||
!m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CMyView2), CSize(rectClient.Width() / 2, rectClient.Height()), pContext))
return FALSE;
m_bSplitter = TRUE; // 窗口已完成分割,视图已经动态创建
Switch(0); // 更改数值以获得切换效果
// return CFrameWnd::OnCreateClient(lpcs, pContext);
return TRUE;
}
修改视图切换函数
BOOL CMainFrame::Switch(int nIndex)
{
CRect rectClient;
GetClientRect(rectClient);
switch (nIndex)
{
case 0:
m_wndSplitter.DeleteView(0, 1);
m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CMyView2), CSize(rectClient.Width() / 2, rectClient.Height()), NULL);
m_wndSplitter.RecalcLayout();
break;
case 1:
m_wndSplitter.DeleteView(0, 1);
m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CMyView3), CSize(rectClient.Width() / 2, rectClient.Height()), NULL);
m_wndSplitter.RecalcLayout();
break;
default:
return FALSE;
}
return TRUE;
}
子分割器之间的切换
声明
CSplitterWnd m_wndSplitter; // 主分割器
CSplitterWnd m_wndSplitter1; // 子分割器1
CSplitterWnd m_wndSplitter2; // 子分割器2
准备视图
从CView或其派生类中派生第五个类:CMyView5
修改相应函数
修改OnCreateClient函数
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
// TODO: 在此添加专用代码和/或调用基类
CRect rectClient;
GetClientRect(&rectClient);
if (!m_wndSplitter.CreateStatic(this, 1, 2) ||
!m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CMyView1),CSize(rectClient.Width() / 2, rectClient.Height()),pContext))
return FALSE;
if (!m_wndSplitter1.CreateStatic(&m_wndSplitter, 2, 1, WS_CHILD) ||
!m_wndSplitter1.CreateView(0, 0, RUNTIME_CLASS(CMyView2), CSize(rectClient.Width() / 2, rectClient.Height() / 2), pContext) ||
!m_wndSplitter1.CreateView(1, 0, RUNTIME_CLASS(CMyView3), CSize(rectClient.Width() / 2, rectClient.Height() / 2), pContext))
return FALSE;
if (!m_wndSplitter2.CreateStatic(&m_wndSplitter, 2, 1, WS_CHILD) ||
!m_wndSplitter2.CreateView(0, 0, RUNTIME_CLASS(CMyView4), CSize(rectClient.Width() / 2, rectClient.Height() / 2), pContext) ||
!m_wndSplitter2.CreateView(1, 0, RUNTIME_CLASS(CMyView5), CSize(rectClient.Width() / 2, rectClient.Height() / 2), pContext))
return FALSE;
m_bSplitter = TRUE; // 窗口已完成分割,视图已经动态创建
Switch(0); // 更改数值以获得切换效果
// return CFrameWnd::OnCreateClient(lpcs, pContext);
return TRUE;
}
修改视图切换函数
BOOL CMainFrame::Switch(int nIndex)
{
CRect rectClient;
GetClientRect(rectClient);
switch (nIndex)
{
case 0:
::SetWindowLong(m_wndSplitter1, GWL_ID, m_wndSplitter.IdFromRowCol(0, 1));
m_wndSplitter1.ShowWindow(SW_SHOW);
::SetWindowLong(m_wndSplitter2, GWL_ID, AFX_IDW_PANE_FIRST);
m_wndSplitter2.ShowWindow(SW_HIDE);
break;
case 1:
::SetWindowLong(m_wndSplitter1, GWL_ID, AFX_IDW_PANE_FIRST);
m_wndSplitter1.ShowWindow(SW_HIDE);
::SetWindowLong(m_wndSplitter2, GWL_ID, m_wndSplitter.IdFromRowCol(0, 1));
m_wndSplitter2.ShowWindow(SW_SHOW);
break;
default:
return FALSE;
}
return TRUE;
}
篇尾声明
单个分割器 参阅资料:https://blog.csdn.net/bao_bei/article/details/60136336
多个分割器 参阅资料:https://blog.csdn.net/bao_bei/article/details/60136336
视图之间的切换 参阅资料:https://www.cnblogs.com/chenzuoyou/p/3342003.html
子分割器之间的切换 原创
MFC中窗口静态分割&视图切换的更多相关文章
- 【MFC】MFC中窗口重绘
MFC中窗口重绘 摘自:http://blog.csdn.net/shuilan0066/article/details/5859057 在刷新窗口时经常要调用重绘函数 MFC提供了三个函数用于窗口重 ...
- MFC中窗口启动后,CEdit编辑框默认光标位置设置,顺序的调节方法
MFC中窗口启动后,CEdit编辑框默认光标位设置,顺序的调节方法 在编辑界面按下ctrl+D键,就会出现所有控件的Tab键顺序,按照自己想要的顺序依次点击控件,就可以重新安排顺序.数值1就是默认停留 ...
- VS2010 MFC中 窗口分割的实现
分割窗口概述 分割窗口,顾名思义,就是将一个窗口分割成多个窗格,在每个窗格中都包含有视图,或者是同一类型的视图,或者是不同类型的视图. MFC分割窗口的方式有两种,动态分割和静态分割. 动态分割窗口通 ...
- MFC中窗口重绘
搬家于CSDN 2015-05-14 MFC提供了三个函数用于窗口重绘 InvalidateRect(&Rect) Invalidate() UpdateWindow() 当需要更新或者重绘窗 ...
- MFC中修改静态文本框中文字的字体、颜色
假设有一个静态文本框控件,其ID为:IDC_STATIC_XSDJ,且关联一个control类的CStatic类型的变量m_static_xsdj. 设置字体时自然要用到CFont类,下面介绍两种方法 ...
- MFC视图切换大全总结
单纯视图之间的切换 单文档多视图切换是我在学习MFC中遇到的一个老大难问题,在今天总算是一一破解了.我觉得视图切换分为三个等级,第一是在未切分窗格的情况下切换视图类:第二是在分割窗格的一个窗格内实行视 ...
- MFC中添加ToolTip提示框
PART 1 MFC 对话框中的 Buttton添加提示 例如我们想在一个对话框中的一个button控件添加tooltip,实现的方法如下: 1. 在该对话框的类中添加一个CToolTipCtrl类型 ...
- MFC 中的设计模式分析
MFC 中的设计模式分析 最近在学习设计模式,突然想到MFC里面其实也包含有设计模式的原理,于是分析了一下,做一个笔记,网上也找了一些资料,在此一并感谢. 创建型模式 单例模式(Singleton P ...
- VC++ MFC中如何将应用程序的配置信息保存到注册表中(二)
在上一篇中介绍了几个写入注册表数据和读取注册表数据的接口,并介绍了使用方法. 这一片教你如何使得你的应用程序在下次打开时保持上一次关闭前的状态. 在上一篇添加的代码的基础上,要添加WM_CLOSE消息 ...
随机推荐
- 【HBase】HBase架构中各种组件的作用
client: 发起读写请求 维护cache,加快读取速度 zookeeper: HMaster选举,存储meta-region的路由信息,监控集群从节点HRegionSever上信息 HMaster ...
- SpringMVC(三)Restful风格及实例、参数的转换
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一.Restful风格 1.Restful风格的介绍 Restful 一种软件架构风格.设计风格,而不是 ...
- Java实现 LeetCode 765 情侣牵手(并查集 || 暴力)
765. 情侣牵手 N 对情侣坐在连续排列的 2N 个座位上,想要牵到对方的手. 计算最少交换座位的次数,以便每对情侣可以并肩坐在一起. 一次交换可选择任意两人,让他们站起来交换座位. 人和座位用 0 ...
- Java实现 蓝桥杯 算法训练 Pollution Solution
试题 算法训练 Pollution Solution 问题描述 作为水污染管理部门的一名雇员,你需要监控那些被有意无意倒入河流.湖泊和海洋的污染物.你的其中一项工作就是估计污染物对不同的水生态系统(珊 ...
- Java实现 LeetCode 680 验证回文字符串 Ⅱ(暴力)
680. 验证回文字符串 Ⅱ 给定一个非空字符串 s,最多删除一个字符.判断是否能成为回文字符串. 示例 1: 输入: "aba" 输出: True 示例 2: 输入: " ...
- Java实现 LeetCode 472 连接词
472. 连接词 给定一个不含重复单词的列表,编写一个程序,返回给定单词列表中所有的连接词. 连接词的定义为:一个字符串完全是由至少两个给定数组中的单词组成的. 示例: 输入: ["cat& ...
- Java实现 蓝桥杯VIP 算法训练 数对
算法训练 数对 时间限制:1.0s 内存限制:512.0MB 问题描述 编写一个程序,该程序从用户读入一个整数,然后列出所有的数对,每个数对的乘积即为该数. 输入格式:输入只有一行,即一个整数. 输出 ...
- java实现圆周率
我国古代数学家对圆周率方面的研究工作,成绩是突出的.三国时期的刘徽.南北朝时期的祖冲之都在这个领域取 得过辉煌战绩. 有了计算机,圆周率的计算变得十分容易了.如今,人们创造了上百种方法求π的值.其中比 ...
- Git中的core.autocrlf选项
项目的开发环境为Windows,在Linux环境下编译,使用Git进行版本控制. 在安装好Git和TortoiseGit后,从远端clone,遇到一个奇怪的问题,Shell脚本中的LF总是被替换成了C ...
- Unit2-窝窝牌电梯
全文共2329字,推荐阅读时间10~15分钟. 文章共分四个部分: 作业分析 评测相关 重构策略 课程体验感受 作业分析 Unit2要求我们模拟现实生活中的电梯调度情景,迭代路径是单电梯->多电 ...