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消息 ...
随机推荐
- jchdl - GSL实例:FullAdder(使用HalfAdder实现)
https://mp.weixin.qq.com/s/5mcYAllizuxyr3QSNrotrw 全加器是能够计算低位进位的二进制加法电路.与半加器相比,全加器不只考虑本位计算结果是否有进位,也考虑 ...
- Java实现 蓝桥杯 算法提高 GPA(暴力)
试题 算法提高 GPA 问题描述 输入A,B两人的学分获取情况,输出两人GPA之差. 输入格式 输入的第一行包含一个整数n表示A的课程数,以下n行每行Si,Ci分别表示第i个课程的学分与A的表现. G ...
- Java实现 第十一届 蓝桥杯 (高职专科组)省内模拟赛
有错误的或者有问题的欢迎评论 十六进制数1949对应的十进制数 19000互质的数的个数 70044与113148的最大公约数 第十层的二叉树 洁净数 递增序列 最大的元素距离 元音字母辅音字母的数量 ...
- Java实现 LeetCode 676 实现一个魔法字典(暴力)
676. 实现一个魔法字典 实现一个带有buildDict, 以及 search方法的魔法字典. 对于buildDict方法,你将被给定一串不重复的单词来构建一个字典. 对于search方法,你将被给 ...
- Java实现蓝桥杯VIP算法训练 自行车停放
试题 算法训练 自行车停放 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 有n辆自行车依次来到停车棚,除了第一辆自行车外,每辆自行车都会恰好停放在已经在停车棚里的某辆自行车的左边或 ...
- Java实现 LeetCode 264 丑数 II(二)
264. 丑数 II 编写一个程序,找出第 n 个丑数. 丑数就是只包含质因数 2, 3, 5 的正整数. 示例: 输入: n = 10 输出: 12 解释: 1, 2, 3, 4, 5, 6, 8, ...
- Java实现 LeetCode 223 矩形面积
223. 矩形面积 在二维平面上计算出两个由直线构成的矩形重叠后形成的总面积. 每个矩形由其左下顶点和右上顶点坐标表示,如图所示. Rectangle Area 示例: 输入: -3, 0, 3, 4 ...
- Java实现 蓝桥杯VIP 算法提高 Torry的困惑(提高型)
算法提高 Torry的困惑(提高型) 时间限制:1.0s 内存限制:512.0MB 问题描述 Torry从小喜爱数学.一天,老师告诉他,像2.3.5.7--这样的数叫做质数.Torry突然想到一个问题 ...
- Java实现 蓝桥杯VIP 算法提高 洗牌
算法提高 洗牌 时间限制:1.0s 内存限制:256.0MB 问题描述 小弱T在闲暇的时候会和室友打扑克,输的人就要负责洗牌.虽然小弱T不怎么会洗牌,但是他却总是输. 渐渐地小弱T发现了一个规律:只要 ...
- Java实现 洛谷 P1422 小玉家的电费
import java.util.*; public class Main { public static void main(String[] args) { Scanner in = new Sc ...