WIN32进阶必备:跟随鼠标移动的子窗口
2014-01-09 21:42
453 查看
上两张Demo的图,方便朋友们选择是否继续看文章.
在子窗口的白色区域按下鼠标左键不放并移动鼠标可以拖拽子窗口跟随鼠标移动.
选择继续看下去的朋友不要担心,接下来就是正文了.
PART 1:Demo功能
呵呵呵,就是纯win32 API方式创建窗口和关联的子窗口,为计划中的小工具做准备吧,计划中要有一个稍复杂的配置界面,采用子窗口的显示和隐藏来切换配置窗口.
PART 2:技术难题
这部分不存在吧,都是win32的基础知识,创建主窗口和子窗口基本相同,都是定义窗口对象的属性和关联方法,属性即WNDCLASS,关联方法即消息处理的回调函数; 让子窗口跟随鼠标左键移动的关键在于理解win32的消息机制并勤快查找MSDN.
PART 3:知识积累
使用win32 API而非MFC的方式对windows的底层机制理解更清晰一些,多个窗口仍然是单线程处理,窗口创建以后循环从消息队列中获取消息并在解析后发给对应的窗口去处理,这里其实就是解析消息归属窗口后调用窗口对应的回调函数处理,整个流程中任何一个地方阻塞都会导致窗口无法响应.
在鼠标移动时候检测鼠标是否按下比想象中的要简单,MSDN查看WM_MOUSEMOVE即可,窗口过程中已经传递了鼠标左键状态.原本是打算用GetKeyStat去获取键盘和鼠标的虚键状态呢.
PART 4:找BUG心得
分享一个小心得吧,win32编程时候如果不明白错误详细,调用GetLastError获取错误信息,错误码+报错函数问度娘,度娘会热心帮忙的.
本次卡壳的地方是创建子窗口调用CreateWindow终返回NULL,GetLastError返回错误码1047,度娘咨询下错误码的意思:1.没有初始WNDCLASS对象的hInstance成员;2.注册的类名是乱码.关注CreateWindow的类名参数解决bug.
PART 5:主要思路
1.生成主窗口,基本是windows的标准创建窗口.
2.创建子窗口,子窗口的创建和主窗口没有明显的区别,注册WNDCLASS类,CreateWindow关联新注册的类和父窗口句柄.
3.子窗口的消息处理,在子窗口的关联方法中处理子窗口相对主窗口的偏移量,采用GetWindowRect分别获取父窗口和子窗口相对屏幕左上角的偏移量,之后计算子窗口相对父窗口左上角的偏移量;在WM_MOUSEMOVE消息中判断鼠标左键是否按下,如果鼠标位于子窗口上且按下鼠标左键移动鼠标,则获取鼠标的偏移并调用MoveWindow移动子窗口,制造一个子窗口跟随鼠标移动的现象.
免积分下载链接:http://download.csdn.net/detail/hd770c/6830919
在子窗口的白色区域按下鼠标左键不放并移动鼠标可以拖拽子窗口跟随鼠标移动.
选择继续看下去的朋友不要担心,接下来就是正文了.
PART 1:Demo功能
呵呵呵,就是纯win32 API方式创建窗口和关联的子窗口,为计划中的小工具做准备吧,计划中要有一个稍复杂的配置界面,采用子窗口的显示和隐藏来切换配置窗口.
PART 2:技术难题
这部分不存在吧,都是win32的基础知识,创建主窗口和子窗口基本相同,都是定义窗口对象的属性和关联方法,属性即WNDCLASS,关联方法即消息处理的回调函数; 让子窗口跟随鼠标左键移动的关键在于理解win32的消息机制并勤快查找MSDN.
PART 3:知识积累
使用win32 API而非MFC的方式对windows的底层机制理解更清晰一些,多个窗口仍然是单线程处理,窗口创建以后循环从消息队列中获取消息并在解析后发给对应的窗口去处理,这里其实就是解析消息归属窗口后调用窗口对应的回调函数处理,整个流程中任何一个地方阻塞都会导致窗口无法响应.
在鼠标移动时候检测鼠标是否按下比想象中的要简单,MSDN查看WM_MOUSEMOVE即可,窗口过程中已经传递了鼠标左键状态.原本是打算用GetKeyStat去获取键盘和鼠标的虚键状态呢.
PART 4:找BUG心得
分享一个小心得吧,win32编程时候如果不明白错误详细,调用GetLastError获取错误信息,错误码+报错函数问度娘,度娘会热心帮忙的.
本次卡壳的地方是创建子窗口调用CreateWindow终返回NULL,GetLastError返回错误码1047,度娘咨询下错误码的意思:1.没有初始WNDCLASS对象的hInstance成员;2.注册的类名是乱码.关注CreateWindow的类名参数解决bug.
PART 5:主要思路
1.生成主窗口,基本是windows的标准创建窗口.
2.创建子窗口,子窗口的创建和主窗口没有明显的区别,注册WNDCLASS类,CreateWindow关联新注册的类和父窗口句柄.
3.子窗口的消息处理,在子窗口的关联方法中处理子窗口相对主窗口的偏移量,采用GetWindowRect分别获取父窗口和子窗口相对屏幕左上角的偏移量,之后计算子窗口相对父窗口左上角的偏移量;在WM_MOUSEMOVE消息中判断鼠标左键是否按下,如果鼠标位于子窗口上且按下鼠标左键移动鼠标,则获取鼠标的偏移并调用MoveWindow移动子窗口,制造一个子窗口跟随鼠标移动的现象.
免积分下载链接:http://download.csdn.net/detail/hd770c/6830919
相关文章推荐
- 点击top回滚到顶部和窗口浮动跟随鼠标上下移动
- JS+html5实现跟随鼠标移动而散开的粒子效果
- win32限制窗口在桌面上的移动范围
- js图片跟随鼠标移动代码
- Unity之路(七):游戏对象跟随鼠标移动示例
- 【ActionScript】利用复制影片duplicateMovieClip与鼠标拖动跟随startDrag做出鼠标移动特效
- js 鼠标放置图片展示大图并跟随鼠标移动
- 一款基于TweenMax跟随鼠标单击移动的div
- Ubuntu 16.04关闭Alt+鼠标左键移动窗口(转)
- QT窗口渐现效果,窗口震动效果,鼠标移动窗口
- 关于wpf中popup跟随鼠标移动显示
- 点击控件跟随鼠标移动
- win32窗口:关于鼠标定位位置偏移问题的原因及解决方法
- Javascript 鼠标移动上去小三角形滑块缓慢跟随效果
- 基于JavaScript实现鼠标悬浮弹出跟随鼠标移动的带箭头的信息层
- Go版GTK:鼠标事件应用—窗口移动
- 【转】(vc)使用CToolTipCtrl让鼠标提示窗口跟着鼠标在屏幕上移动
- div跟随鼠标移动
- 跟随鼠标移动的js代码
- 鼠标移动时让数据窗口中当前鼠标下的数据行改变颜色