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 ...
随机推荐
- vc++6.0设置字体
vc++6.0设置字体 如上图, 在注册表上找到这个位置. 自已设置FontFace和FontSize即可. 计算机\HKEY_CURRENT_USER\Software\Microsoft\Devs ...
- 高通SOC启动流程
背景 开始接手高通开发的有关工作,为了调试底层驱动,因此有必要了解高通平台上电启动的流程是怎么样的. 以 MSM8953 为例子. MSM:mobile station modems,移动基带处理器, ...
- EEPROM、Flash有关知识
存储器分为两大类:RAM(Random Access Memory,任意地址访问储存器)和ROM(Read-Only Memory,只读储存器). 发展历史 ROM Read-Only Memory, ...
- 基于cifar数据集合成含开集、闭集噪声的数据集
前言 噪声标签学习下的一个任务是:训练集上存在开集噪声和闭集噪声:然后在测试集上对闭集样本进行分类. 训练集中被加入的开集样本,会被均匀得打上闭集样本的标签充当开集噪声:而闭集噪声的设置与一般的噪声标 ...
- bs4解析-湖南农场品价格行情
import requests from bs4 import BeautifulSoup import csv url = 'https://price.21food.cn/market/174-p ...
- oeasy教您玩转vim - 77 - # 保留环境viminfo
保留环境viminfo 回忆组合键映射的细节 上次我们定义了session :mks 还可以加载会话session :source Session.vim vim -S Session.vim 基 ...
- 关于failed to load resource 问题的处理
问题: c++做插件,写了一个native class,继承于ue的类ActorComponent,而蓝图里也继承了这个c++ class,都在插件里,每次打开的时候就有这个错误: 之前的解决办法,复 ...
- 游戏开发进行中UE5引擎打不开后续
游戏每次启动都有个问题: 之前我实现了插件里的接口,但是已启动,关于接口这一块的就消失了,有些函数还在但是却是自定义事件,不是接口里的,Class Settings里面也提了 然后我把他改成了新的ch ...
- java8interface的新特性:default,static,funcation
default:默认方法 在类接口中可以直接定义的方法,实现接口的类可以直接使用 使用案例: public interface MyInterface { default void display() ...
- Jenkins如何使用CrumbIssuer防御CSRF攻击
1.CSRF(跨站请求伪造)概述 在讲解Jenkins的跨站请求伪造(CSRF)保护机制之前,让我们首先对CSRF这一安全威胁及其重要性进行简明扼要的概述. 1.1 CSRF(跨站请求伪造)的原理 ...