Win32 拆分窗口
前两天学习了MFC的拆分窗口,今天来学习Win32 SDK下如何拆分窗口.
win32是没有像MFC那样直接有函数方法拆分窗口,只能自己处理了.
1.在WM_CREATE消息中创建两个控件,TreeView,ListView
//创建左边树形视图控件TreeView,扩展风格样式为3D风格WS_EX_CLIENTEDGE
HWND m_hTree = CreateWindowEx(WS_EX_CLIENTEDGE, WC_TREEVIEW, NULL,
WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | TVS_LINESATROOT|TVS_HASLINES|TVS_HASBUTTONS,
0, 0, 0, 0, hWnd, NULL, lpCreate->hInstance, NULL); //创建右边列表视图控件ListView
HWND m_hList = CreateWindowEx(WS_EX_CLIENTEDGE, WC_LISTVIEW, NULL,
WS_VISIBLE | WS_CHILD | WS_CLIPSIBLINGS|LVS_REPORT,
0, 0, 0, 0, hWnd, NULL, lpCreate->hInstance, NULL); //获取窗口客服区大小
RECT rc;
GetClientRect(hWnd, &rc);
m_splitterPos = rc.right /4; //设定分界线水平位置在窗口水平的1/4 m_hCursor = LoadCursor(NULL, IDC_SIZEWE); //设定在分界线上的鼠标样式为东西方向的箭头光标
2.在WM_SIZE消息中调整两个控件的位置
LRESULT OnSize(UINT nType, int cx, int cy)
{
//根据分界线的位置,重新设置树形控件和列表控件的位置
//在分界线的位置-1是留下能捕获鼠标消息的位置,不然挤太紧了鼠标移动消息捕获不了.
MoveWindow(m_treeCtrl.GetHandle(), 0, 0, m_splitterPos-1, cy, true);
MoveWindow(m_listCtrl.GetHandle(), m_splitterPos+1, 0, cx - m_splitterPos, cy, true);
//获取列表控件的尺寸
RECT rc;
GetClientRect(m_listCtrl.GetHandle(), &rc); //根据列表控件新的大小,重新设置每列的宽度
int nListWidth = rc.right - 20;
int nListColwidth = nListWidth / 10;
int nCols[] = {
nListColwidth*2,
nListColwidth*2,
nListColwidth,
nListColwidth,
nListColwidth*4
};
for (int i=0;i<5;i++)
{
ListView_SetColumnWidth(m_listCtrl.GetHandle(), i, nCols[i]);
} return 0;
}
3.捕获鼠标消息WM_LBUTTONDOWN,和WM_LBUTTONUP
LRESULT OnLButtonDown(HWND hWnd,UINT nFlags, POINT pos)
{
if (pos.x >= m_splitterPos - 10 && pos.x <= m_splitterPos + 10)
{
m_IsSplit = TRUE; //标识可以拖拽
/*SetCursor(m_hCursor);
SetCapture(hWnd);*/
}
return 0;
} LRESULT OnLButtonUp(HWND hWnd, UINT nFlags, POINT pos)
{
if (m_IsSplit)
{
m_IsSplit = FALSE; //标识不可拖拽
ReleaseCapture();
}
return 0;
}
4.在鼠标WM_MOUSEMOVE消息中实现鼠标拖拽
LRESULT OnMouseMove(HWND hWnd, UINT nFlags, POINT pos)
{
if (pos.x >= m_splitterPos - 10 && pos.x <= m_splitterPos + 10)
{
//m_IsSplit = TRUE;
SetCursor(m_hCursor);//设置鼠标样式为东西方向
SetCapture(hWnd); //捕获鼠标
}
else
{
ReleaseCapture(); //释放鼠标
} if (nFlags == MK_LBUTTON && m_IsSplit)//鼠标拖拽两边控件随着更改位置
{
RECT rc;
GetClientRect(hWnd, &rc);
m_splitterPos = pos.x;
//根据新的分界位置发送WM_SIZE消息,重新调整左右控件的位置
SendMessage(hWnd, WM_SIZE, 0, MAKELPARAM(rc.right, rc.bottom));
}
return 0;
}
5.效果


为啥截屏没有鼠标样式.
Win32 拆分窗口的更多相关文章
- JAVA 拆分窗口
//拆分窗口 import java.awt.*; import javax.swing.*; public class Jiemian8 extends JFrame{ JSplitPane cf; ...
- MFC拆分窗口及它们之间的数据交换(转)
转自:http://blog.csdn.net/nuptboyzhb/article/details/7455471 源代码:http://download.csdn.net/detail/nuptb ...
- MFC拆分窗口及它们之间的数据交换
源代码:http://download.csdn.net/detail/nuptboyzhb/4221531 CSplitterWnd类 CSplitterWnd类提供一个分隔器窗口的功能,分隔器窗口 ...
- 拆分窗口QSplitter
拆分窗口中可以添加许多子控件,各个子控件通过拆分线相互分隔开来,拖动该拆分线可以随意改变子控件大小 import sys from PyQt5.QtCore import Qt from PyQt5. ...
- MFC单文档视图拆分窗口和相关链接
第一步:准备2个视图类(如CTViewOne, CTViewTwo) 第二步:在CMainFrame类的头文件中添加数据成员变量: //MainFrm.h protected: CSplitterWn ...
- MFC单文档多视图程序设计与Splitter拆分窗口
1. 创建不同的子frame. 在文档视图程序中 CMainFrame(class CMainFrame : public CMDIFrameWndEx) 继承自 CMDIFrameWnd (CMDI ...
- Qt QSplitter任意拆分窗口
Qt拆分窗口可以使用QSplitter,也可以使用比较容易使用布局控件来完成,本文章给出使用QSplitter分割窗口的例子. QSplitter 继承自QFrame,而QFrame又继承自QWidg ...
- c++ win32下窗口的最小化到托盘以及还原
框架是用visual studio创建的win32控制台模板,然后自己添加最小化及还原部分代码. 需要额外包含的头文件: #include <shellapi.h> #include &l ...
- Pycharm使用技巧:Split Vertically/Horizontally(垂直/水平拆分窗口)
Split Vertically或者Split Horizontally可以把当前编辑窗口垂直或者水平拆分成两个. 使用: 在编辑窗口中打开你要展示的两个文件(如图中的 "郭靖" ...
- Win32 设置窗口透明度 SetLayerTransparent
注意: 在调用SetLayeredWindowAttributes 之前,需要给窗口加上WS_EX_LAYERED属性,否则会无效 void SetLayerTransparent(HWND hWnd ...
随机推荐
- .NET下 支持大小写不敏感的JSON Schema验证方法
问题 有很多应用程序在验证JSON数据的时候用到了JSON Schema. 在微服务架构下,有时候各个微服务由于各种历史原因,它们所生成的数据对JSON Object属性名的大小写规则可能并不统一,它 ...
- mysql+redis点赞功能剖析
最近在一个应用上需要用到点赞的功能,因为点赞的功能比较常用,很多人看到了大拇指就点了上去,如果单单采用mysql的方式的话可以会对数据库造成很大的压力. 我看了下网上一些博主的提供的解决方案,主要以m ...
- 降维(三)LLE与其他降维技术
LLE 局部线性嵌入,Locally Linear Embedding(LLE)是另一个功能强大的非线性降维(nonlinear dimensional reduction,NLDR)技术.它是一个流 ...
- 在C#中使用RabbitMQ做个简单的发送邮件小项目
在C#中使用RabbitMQ做个简单的发送邮件小项目 前言 好久没有做项目了,这次做一个发送邮件的小项目.发邮件是一个比较耗时的操作,之前在我的个人博客里面回复评论和友链申请是会通过发送邮件来通知对方 ...
- 算法金 | 一个强大的算法模型,GPR !!
大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」 抱个拳,送个礼 高斯过程回归(GPR)是一种非参数化的贝叶斯方法,用于解决回归问题.与 ...
- computed 和 watch 的区别和运用的场景?
computed: 是计算属性,依赖其它属性值,并且 computed 的值有缓存,只有它依赖的属性值发生改变,下一次获取 computed 的值时才会重新计算 computed 的值: watch: ...
- oeasy 教您玩转linux 之010208 满屏乱码 bb
我们来回顾一下 上一部分我们都讲了什么? 黑客帝国 各种速度颜色参数 最后我们想找一个让人完全崩溃的软件包,这不就来了,话不多说,先试试. apt show bbapt search bbsudo a ...
- oeasy教您玩转vim - 54 - # 匹配替换
查找细节 回忆上节课内容 我们学习了 替换 substitude 替换单行 :s/shiyanlou/oeasy 加上range :3,5s/shiyanlou/oeasy :%s/shiyanl ...
- oeasy教您玩转vim - 79 - # 编码格式encoding
- `help encoding-name` 给Visual Studio的C++工程集成FFmpeg
<FFmpeg开发实战:从零基础到短视频上线>一书的"第11章 FFmpeg的桌面开发"介绍了如何在Windows环境对Qt结合FFmpeg实现桌面程序,那么Win ...