WIN32进阶必备:跟随鼠标移动的子窗口
上两张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
WIN32进阶必备:跟随鼠标移动的子窗口的更多相关文章
- win32进阶必备:多线程同步之互斥锁
应用多线程互斥锁之前首先简单过一下C程序可能用到的3个创建线程函数: CreateThread,windows系统提供的唯一创建线程API,_beginthread和_beginthreadex都在内 ...
- windows 编程 —— 子窗口 与 子窗口控件
目录: 子窗口与主窗口的交互 子窗口控件 按钮类别 button 滚动条类别 scrollbar 静态类别 static 编辑框类别 edit 清单方块 listbox 子窗口与主窗口的交互 创建窗 ...
- js进阶 12-3 如何实现元素跟随鼠标移动
js进阶 12-3 如何实现元素跟随鼠标移动 一.总结 一句话总结:获取鼠标位置,将鼠标位置设置为元素偏移即可. 1.用什么事件获取鼠标位置? 用mousemove可以获取鼠标移动的时候的位置 $(d ...
- win32进阶之路:程序托盘图标+右键弹出菜单
开场白 本次介绍两个非常棒且实用的技巧:程序托盘图标和右键弹出菜单,效果如下图. 程序托盘图标用了迅雷的图标,右键点击时候会弹出三个选项的菜单. 程序托盘图标设置 我会用尽可能清晰明了的步骤介绍方式 ...
- html5跟随鼠标炫酷网站引导页动画特效
html5跟随鼠标炫酷网站引导页动画特效一款非常不错的引导页,文字效果渐变,鼠标跟随出绚丽的条纹.html5炫酷网站引导页,鼠标跟随出特效. 体验效果:http://hovertree.com/tex ...
- JS打造的跟随鼠标移动的酷炫拓扑图案
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 【翻译】使用CSS3和jQuery制作跟随鼠标方位的Hover特效
今天我们来学习如何通过CSS3的特性和jQuery来创建一个感知鼠标滑动方向的hover效果.当鼠标滑进的时候,遮罩层会从上次鼠标滑出的方向滑入,当鼠标滑出的时候,遮罩层会跟随鼠标,从鼠标滑出的方向滑 ...
- canvas实现跟随鼠标旋转的箭头
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta ht ...
- Adobe Edge Animate –获取鼠标位置及跟随鼠标功能实现
Adobe Edge Animate –获取鼠标位置及跟随鼠标功能实现 版权声明: 本文版权属于 北京联友天下科技发展有限公司. 转载的时候请注明版权和原文地址. 在网络上浏览有关Edge相关问题的时 ...
随机推荐
- WCF之各种WCF引用方式
写在开头:本文内容来自 WCF全面解析中的一个经典例子,如果你已经看过了,那么可以忽略本文,本文旨在和大家分享不一样的WCF使用方法. 准备工作: 1.创建解决方案WCFService(当然名字可以任 ...
- OWASP-ZAP
Zed Attack Proxy简写为ZAP,是一个简单易用的渗透测试工具,是发现Web应用中的漏洞的利器,更是渗透测试爱好者的好东西. ZAP下载地址:https://www.owasp.org/i ...
- Android安全问题 抢先开机启动
导读:我们以如何抢先开机启动为例,来说明接收无序广播的静态广播接收器的接收顺序 (注意,文本只是陈述结果,所以叫结果篇,之后的文章再给出源码分析) 首先先说一下android中的广播和广播接收器 广播 ...
- SSH应该使用密钥还是密码?
关于SSH,几乎每个人都同意密钥要优于密码,更安全,并且更先进,但我并不同意这个观点. 虽然密钥的确可以更好,但它有着还没被意识到的严重风险,并且我认为比得到妥善管理的密码更不安全. 通常密钥更好的理 ...
- linux netcat命令
netcat是网络工具中的“瑞士军刀”,它能通过TCP和UDP在网络中读写数据.通过与其他工具结合和重定向,你可以在脚本中以多种方式使用它.使用netcat命令所能完成的事情令人惊讶. netcat所 ...
- C#.Net 如何动态加载与卸载程序集(.dll或者.exe)6-----在不卸载程序域的前提下替换程序集文件。
当某个程序集文件被载入AppDomain,该文件在AppDomain.Unload之前是不能被替换和删除的.使用AppDomainSetup的影像复制功能可以实现在不卸载程序的情况下替换或者删除程序集 ...
- Android开发之布局的学习
FrameLayout-帧布局 实现效果: 代码: <?xml version="1.0" encoding="utf-8"?> <Frame ...
- Python图
从一位前辈的博客看到了一张图,先转过来,稍后再细看
- 请用一句话概括JSONP
服务器调用客户端的函数(即回调函数),在客户端就能拿到服务端传入的参数(即返回结果)
- c# 控件闪烁处理方法
如果你在Form中绘图的话,不论是不是采用的双缓存,都会看到图片在更新的时候都会不断地闪烁,解决方法就是在这个窗体的构造函数中增加以下三行代码:请在构造函数里面底下加上如下几行:SetStyle(Co ...