前两天学习了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 拆分窗口的更多相关文章

  1. JAVA 拆分窗口

    //拆分窗口 import java.awt.*; import javax.swing.*; public class Jiemian8 extends JFrame{ JSplitPane cf; ...

  2. MFC拆分窗口及它们之间的数据交换(转)

    转自:http://blog.csdn.net/nuptboyzhb/article/details/7455471 源代码:http://download.csdn.net/detail/nuptb ...

  3. MFC拆分窗口及它们之间的数据交换

    源代码:http://download.csdn.net/detail/nuptboyzhb/4221531 CSplitterWnd类 CSplitterWnd类提供一个分隔器窗口的功能,分隔器窗口 ...

  4. 拆分窗口QSplitter

    拆分窗口中可以添加许多子控件,各个子控件通过拆分线相互分隔开来,拖动该拆分线可以随意改变子控件大小 import sys from PyQt5.QtCore import Qt from PyQt5. ...

  5. MFC单文档视图拆分窗口和相关链接

    第一步:准备2个视图类(如CTViewOne, CTViewTwo) 第二步:在CMainFrame类的头文件中添加数据成员变量: //MainFrm.h protected: CSplitterWn ...

  6. MFC单文档多视图程序设计与Splitter拆分窗口

    1. 创建不同的子frame. 在文档视图程序中 CMainFrame(class CMainFrame : public CMDIFrameWndEx) 继承自 CMDIFrameWnd (CMDI ...

  7. Qt QSplitter任意拆分窗口

    Qt拆分窗口可以使用QSplitter,也可以使用比较容易使用布局控件来完成,本文章给出使用QSplitter分割窗口的例子. QSplitter 继承自QFrame,而QFrame又继承自QWidg ...

  8. c++ win32下窗口的最小化到托盘以及还原

    框架是用visual studio创建的win32控制台模板,然后自己添加最小化及还原部分代码. 需要额外包含的头文件: #include <shellapi.h> #include &l ...

  9. Pycharm使用技巧:Split Vertically/Horizontally(垂直/水平拆分窗口)

    Split Vertically或者Split Horizontally可以把当前编辑窗口垂直或者水平拆分成两个. 使用: 在编辑窗口中打开你要展示的两个文件(如图中的  "郭靖" ...

  10. Win32 设置窗口透明度 SetLayerTransparent

    注意: 在调用SetLayeredWindowAttributes 之前,需要给窗口加上WS_EX_LAYERED属性,否则会无效 void SetLayerTransparent(HWND hWnd ...

随机推荐

  1. HMS Core 6.2.0版本发布公告

    新增动作捕捉能力.通过简单拍摄即可获得人体3D骨骼关键点数据,广泛应用于虚拟形象.体育运动和医学分析等场景: 3D物体建模能力iOS版本上线. 查看详情>> 新增道路吸附能力.可根据坐标点 ...

  2. 金蝶云·苍穹追光者开发大赛,点燃高校AI应用创新之火

    在 2024 年的政府工作报告中,"人工智能 +" 行动被提出,标志着人工智能成为推动我国新质生产力发展的关键力量.与此同时,今年的高考作文有一道题目也聚焦于人工智能,再次凸显了这 ...

  3. 没想你是这样的AI。。。

  4. FFmpeg开发笔记(三十六)Linux环境安装SRS实现视频直播推流

    ​<FFmpeg开发实战:从零基础到短视频上线>一书在第10章介绍了轻量级流媒体服务器MediaMTX,通过该工具可以测试RTSP/RTMP等流媒体协议的推拉流.不过MediaMTX的功能 ...

  5. WTM的项目中EFCore如何适配人大金仓数据库

    一.WTM是什么 WalkingTec.Mvvm框架(简称WTM)最早开发与2013年,基于Asp.net MVC3 和 最早的Entity Framework, 当初主要是为了解决公司内部开发效率低 ...

  6. C# 泛型单例工厂

    核心代码,线程安全 class SingletonFactory<T> where T : new() { private static T uniqueInstance; private ...

  7. 数组的创建-数组-C

    数组内存是连续的 数组是一个整体,它的内存是连续的:也就是说,数组元素之间是相互挨着的,彼此之间没有一点点缝隙.下图演示了int a[4];在内存中的存储情形: 「数组内存是连续的」这一点很重要,所以 ...

  8. 记一次在openEuler系统下离线编译升级到openssh9.8p1

    缘起 由于某个项目上甲方对服务器进行漏洞扫描,系统为:openEuler 22.03 (LTS-SP4).提示现有OpenSSH版本存在漏洞,需要升级到openssh-9.8p1的版本(目前最新),遂 ...

  9. java的自动拆箱会发生NPE

    平时的小细节,总能在关键时刻酿成线上事故,最近在代码中使用了Integer的自动拆箱功能,结果NPE(NullPointException)了,悲剧啊... 一.何为自动拆箱 要说自动拆箱,就必须说自 ...

  10. 移植自淘宝店家的,硬件SPI通讯3.5寸TFT,LCD屏幕。MSPM0G3507

    适用MSPM0G3507 LP开发板 3.5寸TFTLCD屏,SPI通讯 项目是CCStheia的 特点:硬件SPI,速度更快,可以在syscfg中自行修改引脚 蓝奏云: https://wwo.la ...