前两天学习了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. 高通lk:配置与使用i2c

    高通lk:配置与使用i2c 以msm8909为例. 背景 在lk中要去驱动一个aw9523的ic来控制指示灯. 但是现在对应的i2c没有打开.因此需要进行处理. 步骤 找到I2C对应的ID与句柄 参考 ...

  2. 全志科技T3国产工业核心板规格书(四核ARM Cortex-A7,主频1.2GHz)

    1 核心板简介 创龙科技SOM-TLT3是一款基于全志科技T3处理器设计的4核ARM Cortex-A7国产工业核心板,每核主频高达1.2GHz. 核心板通过邮票孔连接方式引出CSI.TVIN.MIP ...

  3. WebGL压缩纹理实践

    0x01 本文将讲述压缩纹理在实际项目中的使用的案例.最近的一个项目是这样的:项目由于涉及到的建筑物特别多,大概有近40栋的建筑,而每一栋建筑物,又有10层楼,每层楼里面又有很多的设备.这就导致我们需 ...

  4. git 更新某个目录或文件

    不多说直接贴代码 更新文件 $ git fetch remote: Counting objects: 8, done. remote: Compressing objects: 100% (3/3) ...

  5. oeasy教您玩转vim - 13 - # 大词小词

    大词小词 回忆上节课内容 我们上次学习了 e e 代表 end 词尾 自有跳跃 还可以成倍次数的跳跃 但其实我是想以一个一个属性地跳跃,有没有方法呢? 查询帮助 没思路的话我们还是得继续查询 :h w ...

  6. 解决: Cannot load information for github.com

    问题在共享项目至idea时候出现:I am getting this error while sharing on GithHub in Intellije IDEA : Cannot load in ...

  7. OpenGL 4.0中数据缓冲VBO,VAO,EBO的使用总结

    Opengl是大家常用的一个API,我们用它绘制数据的时候需要使用vao,vbo,ebo等对象,绘制方式分为 vao绘制,ebo绘制等.使用不同api还能分为普通调用以及Instance绘制. 首先申 ...

  8. pytest-req插件:更简单的做接口测试

    pytest-req插件:更简单的做接口测试 背景 我们经常会用到 pytest 和 requests 进行接口自动化测试. pytest 提供了非常方便的插件开发能力,在pytest中使用reque ...

  9. 周末玩一下云技术,kvm 相关笔记

    由于需要将企业的很贵的显卡和主机装在一个虚拟主机,用来跑  ue5 和 sd3  用来给用户临时使用,但是怎么将主机虚拟出来成多个主机呢,自己没有有钱请不起人,只能自己学一下虚拟化技术,第一步主机开启 ...

  10. dcoker file

    dockerfile是来构建镜像文件 [root@docker docker-test-volume]# pwd /home/docker-test-volume vi ./dockerfile 通过 ...