MFC 窗口分割
动态分割窗口:
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
if (m_WndSplitter.Create(this, , , CSize(, ), pContext))
{
return TRUE;
}
else
{
return false;
}
//return CFrameWnd::OnCreateClient(lpcs, pContext);
}
静态分割窗口:
为MainFrame类添加两个成员变量如下,并重载虚函数OnCreateClient,以实现窗口分割。
CSplitterWnd m_WndSplitter1;
CSplitterWnd m_WndSplitter2;
virtual BOOL OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext);
以CView为基类创建CView2,CView3,CView4类。
在MainFrame.cpp包含所有视图头文件
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
CRect rect;
GetClientRect(&rect);
m_WndSplitter1.CreateStatic(this,,); //创建一个静态分栏窗口,分为3行一列 m_WndSplitter1.CreateView(, , RUNTIME_CLASS(C窗口分割2View), CSize(, ), pContext); //连接0行0列窗格 m_WndSplitter1.CreateView(, , RUNTIME_CLASS(CView2), CSize(, ), pContext); //用cview2连接1行0列窗格 //将两行0列再分开1行2列
if (!m_WndSplitter2.CreateStatic(&m_WndSplitter1, , , WS_CHILD | WS_VISIBLE, m_WndSplitter1.IdFromRowCol(, )))
return FALSE; m_WndSplitter2.CreateView(, , RUNTIME_CLASS(CView3), CSize(, ), pContext); //用cview3连接到第二个分行对象0行0列窗格 m_WndSplitter2.CreateView(, , RUNTIME_CLASS(CView4), CSize(, ), pContext); //用cview4连接到第二个分行对象0行1列窗格 return TRUE;
}
固定分割窗口的分割线:
以 CSplitterWnd为基类,创建新的CFixSplitterWnd 类,并在CFixSplitterWnd 类中手动添加WM_LBUTTONDOWN、WM_MOUSEMOVE、WM_SETCURSOR消息的消息映射和消息响应函数。
CFixSplitterWnd 类代码如下:
class CFixSplitterWnd :
public CSplitterWnd
{
public:
CFixSplitterWnd(BOOL b_lock=TRUE);
virtual ~CFixSplitterWnd();
public:
BOOL m_block;
void Lock() { m_block = true; } //锁定分割线
void UnLock() { m_block = FALSE; } //不锁定分割线 DECLARE_MESSAGE_MAP()
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);
};
CFixSplitterWnd::CFixSplitterWnd(BOOL b_lock)
{
m_block = b_lock;
} CFixSplitterWnd::~CFixSplitterWnd()
{
}
BEGIN_MESSAGE_MAP(CFixSplitterWnd, CSplitterWnd)
ON_WM_LBUTTONDOWN()
ON_WM_MOUSEMOVE()
ON_WM_SETCURSOR()
END_MESSAGE_MAP() void CFixSplitterWnd::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if (!m_block)
CSplitterWnd::OnLButtonDown(nFlags, point);
else
CWnd::OnLButtonDown(nFlags,point);
} void CFixSplitterWnd::OnMouseMove(UINT nFlags, CPoint point) //移动鼠标
{
// TODO: Add your message handler code here and/or call default
if (!m_block)
CSplitterWnd::OnMouseMove(nFlags, point);
else
CWnd::OnMouseMove(nFlags, point);
} BOOL CFixSplitterWnd::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) //设置光标
{
// TODO: Add your message handler code here and/or call default
if (!m_block)
return CSplitterWnd::OnSetCursor(pWnd, nHitTest, message);
else
return CWnd::OnSetCursor(pWnd, nHitTest, message);
}
在CMainFrame类中 ,m_WndSplitter1、 m_WndSplitter2的基类由 CSplitterWnd 设置为 CFixSplitterWnd.重载的 OnCreateClient 代码如下.
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
// TODO: Add your specialized code here and/or call the base class m_WndSplitter1.Lock();
m_WndSplitter2.UnLock(); m_WndSplitter1.CreateStatic(this, , ); m_WndSplitter1.CreateView(, , RUNTIME_CLASS(C窗口分割3View), CSize(, ), pContext);//连接0行0列窗格 m_WndSplitter1.CreateView(, , RUNTIME_CLASS(CView2), CSize(, ), pContext);//用cview2连接1行0列窗格 //将两行0列再分开1行2列
if (!m_WndSplitter2.CreateStatic(&m_WndSplitter1, , , WS_CHILD | WS_VISIBLE,
m_WndSplitter1.IdFromRowCol(, )))
return FALSE; m_WndSplitter2.CreateView(, , RUNTIME_CLASS(CView3), CSize(, ), pContext);//用cview3连接到第二个分行对象0行0列窗格 m_WndSplitter2.CreateView(, , RUNTIME_CLASS(CView4), CSize(, ), pContext);//用cview4连接到第二个分行对象0行1列窗格 return TRUE; // return CFrameWnd::OnCreateClient(lpcs, pContext);
}
MFC 窗口分割的更多相关文章
- MFC窗口分割以及各窗口间的通讯
一个偶然的机会又重新接触了MFC窗口的分割,自己结合资料重新写了一个窗口分割的程序,现将具体流程跟大家分享一下: 1.我们先创建一个MFC单文档类的程序,具体分割方式先将单文档整个客户区分成两行一列, ...
- MFC 窗口分割与通信
一.关于CSplitterWnd类我们在使用CuteFtp或者NetAnt等工具的时候,一般都会被其复杂的界面所吸引,在这些界面中窗口被分割为若干的区域,真正做到了窗口的任意分割. 那么我们自己如何创 ...
- MFC程序实现窗口分割,视图快捷插入控件和插入列表
将视图中插入列表: 1.创建一个MFC应用程序,在MFC Wizard中,生成的类选项,如图 2.选择CListView作为基类 3.在CXXView.cpp(XX为你的程序名)重写虚函数OnInit ...
- VS2010 MFC中 窗口分割的实现
分割窗口概述 分割窗口,顾名思义,就是将一个窗口分割成多个窗格,在每个窗格中都包含有视图,或者是同一类型的视图,或者是不同类型的视图. MFC分割窗口的方式有两种,动态分割和静态分割. 动态分割窗口通 ...
- MFC界面分割以及挂载
MFC中文档与视图(二) Last Edit 2013/11/19 这篇主要是介绍一下怎么去分割视图. 视图的分割分为:动态分割,静态分割.所谓的静态分割是指软件一启动视图就分割完成,而动态分割是在 ...
- 将Cocos2dX渲染到MFC窗口上
引用:http://www.cnblogs.com/windeer/archive/2012/11/18/2767750.html 引言 现在智能手机已经慢慢进入大众化,移动类应用开始火爆起来,游戏类 ...
- 同时支持控制台和MFC窗口程序的APP
BOOL CMyApp::InitInstance() { if ( m_bShowGui==FALSE ) { FILE *stream = NULL; AllocConsole(); // 开辟控 ...
- MFC窗口重绘
Invalidate()与 UpdateAllViews()有什么分别 Invalidate()是让程序重画窗口. UpdateAllViews()是在DOC/VIEW结构中, 当一个视图的数据改变后 ...
- 重写MFC窗口上的关闭按钮事件(SDI, MDI, Dialog)
This piece of code demonstrate how to override WM_CLOSE event. 点击窗口关闭按钮,触发相关事件! 有时候,在MFC程序退出之前,我们通常会 ...
随机推荐
- 《javascript高级程序设计》读书笔记1
第二章 在HTML中引用javascript 1.<script>标签的位置:为了避免加载过多的JavaScript的脚本导致浏览器窗口一片空白.现代的web程序一般都把全部的 JavaS ...
- [CLR via C#]11. 事件
一. 设计要公开事件的类型 如果类型定义了事件成员,那么类型(或类型实例)就可以通知其他对象发生了一些特定的事情. 例如,Button类提供了一个名为Click的事件.应用程序中的一个或多个对象可能想 ...
- csharp: MongoDB
安装配置: Install MongoDB on Windows(安装配置官方参考) http://docs.mongodb.org/manual/tutorial/install-mongodb-o ...
- 泛函编程(11)-延后计算-lazy evaluation
延后计算(lazy evaluation)是指将一个表达式的值计算向后拖延直到这个表达式真正被使用的时候.在讨论lazy-evaluation之前,先对泛函编程中比较特别的一个语言属性”计算时机“(s ...
- Scala on Visual Studio Code
Download and install Scala Download a scala installation package from here. Then install it. Linux s ...
- 一个web页面的访问的过程
Browers是如何在浩瀚的互联网上找到我们需要的资源呢? 以下将记录这个过程,这个过程是web编程需要需要熟知的. 用户打开浏览器输入目标地址(比如http://www.sina.com),那么接下 ...
- RAID选项
RAID:Redundant Array Independent Disk(独立磁盘构成的具有冗余能力的阵列) 最常见的为RAID类型为:0,1,5和10:3和6很少见,但在某些环境中仍然有用. RA ...
- Java中Scanner类和BufferReader类之间的区别
java.util.Scanner类是一个简单的文本扫描类,它可以解析基本数据类型和字符串.它本质上是使用正则表达式去读取不同的数据类型. Java.io.BufferedReader类为了能够高效的 ...
- Play 内置模板标签(1.2.3版本)http://www.anool.net/?p=617
a标签: 用来插入一个连接到控制器方法的html link.如下: #{a @Application.logout()}Disconnect#{/a}模板内容被解析后变成: <a href=&q ...
- 【使用 DOM】使用 Window 对象
1. 获取 Window 对象 可以用两种方式获得Window对象.正规的HTML5方式是在Document对象上使用defaultView属性.另一种是使用所有浏览器都支持的全局变量window . ...