无标题栏窗口移动方法种种

无标题栏窗口移动方法种种

ID:10807903

大小:86.00 KB

页数:16页

时间:2018-07-08

无标题栏窗口移动方法种种_第1页
无标题栏窗口移动方法种种_第2页
无标题栏窗口移动方法种种_第3页
无标题栏窗口移动方法种种_第4页
无标题栏窗口移动方法种种_第5页
资源描述:

《无标题栏窗口移动方法种种》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、无标题栏窗口移动方法种种首先,看看在正常情况下系统是怎样来移动程序窗口的。当使用者在程序窗口标题栏区域(非工作区)内,按下鼠标左键时将会发生下列事情:◆系统向该窗口过程函数发送WM_NCLBUTTONDOWN消息。◆WM_NCLBUTTONDOWN消息最终将传送到窗口过程函数中的DefWindowProc()函数中去。◆DefWindowProc()函数将根据鼠标左键按下并移动,以及HTCAPTION标识所表示鼠标按下时的位置诸多信息,来执行该消息的缺省动作即窗口随同鼠标光标一起移动的操作。下面作为练习来测试一下,首先在

2、窗口回调函数(即窗口过程函数)中设置下列语句:caseWM_NCLBUTTONDOWNreturn0;然后,同样是在窗口标题栏内按住鼠标左键并移动鼠标,但此时窗口却并不随同鼠标一起移动了,这是怎么回事?这是因为上述语句中设有“return0”语句的缘故。该语句使得WM_NCLBUTTONDOWN消息未能传递到DefWindowProc()函数,就在窗口过程函数中提前返回了,当然移动窗口的操作就无从进行了。这也从反面印证了一个事实,那就是,最后完成移动窗口的操作将是由DefWindowProc()函数来完成的。通过上面的分

3、析可以勾划出这样一个操作过程:即用户在窗口标题栏内按下鼠标左键→系统发送WM_NCLBUTTONDOWN消息→DefWindowProc()函数接收消息→用户移动鼠标→DefWindowProc()函数执行窗口随同鼠标一起移动的操作。由此得出一个结论,那就是要想实现移动窗口的操作,必须具备两个条件:一是要按下鼠标左键并移动(DefWindowProc()函数将检测这个条件);二是在按下鼠标左键时能发送WM_NCLBUTTONDOWN消息并返回HTCAPTION标识。下面就根据以上的分析,在没有窗口标题栏的情况下,采取骗取

4、DefWindowProc()函数的方式,来实现对无标题栏窗口实体的移动操作。1、主动发送WM_NCLBUTTONDOWN消息在窗口没有标题栏的情况下,在窗口实体上按下鼠标左键时,系统是不会发送WM_NCLBUTTONDOWN消息的,这是因为鼠标光标是在窗口的工作区内被按下的,此时系统发送的是WM_LBUTTONDOWN消息。但通过上述的分析,可以知道DefWindowProc()函数并不关心WM_NCLBUTTONDOWN消息是由谁发出的,而只是关心是否有该消息发出。这样只要我们在按下鼠标左键的事件中,主动将WM_NC

5、LBUTTONDOWN16消息发出,岂不就可同时满足这两个条件吗!下面的代码就是根据这个思路来设计的。caseWM_LBUTTONDOWN:SendMessage(hWnd,WM_NCLBUTTONDOWN,HTCAPTION,0);break;消息发送时,通过HTCAPTION参数给DefWindowProc()函数带去一个信息,告诉它鼠标左键是在窗口非工作区内的标题栏处按下的。当然这是一个假情报,但DefWindowProc()函数会信以为真并根据这个信息来执行相应的操作。2、主动发送WM_SYSCOMMAND消息c

6、aseWM_LBUTTONDOWN:SendMessage(hWnd,WM_SYSCOMMAND,SC_DRAGMOVE,0);break;能使用WM_SYSCOMMAND消息来移动窗口,得益于一个新近扩展的SC_DRAGMOVE风格标志,该标志从字面上就能看出是"拖曳移动"的意思。该标志在低版本的编译器(VC6.0中就没有)中是找不到的,所以在引用该标志时应预先声明:#defineSC_DRAGMOVE0xF012也可以直接使用其常量值:SendMessage(hWnd,WM_SYSCOMMAND,0xF012,0);

7、上述无标题栏窗口移动窗体的机理与窗口有标题栏时是相似的,相同处最后都是由DefWindowProc()函数来完成实际的操作;不同处是发送消息的方式不同,一个是由系统隐含发送;另一个则是由程序公开发送。采取上述两种方法来移动窗口,同有标题栏移动窗口的视觉效果是一样的,那就是在移动时,先移动一个指示框(一个虚线框),等确定好窗体移动后的新位置后,当松开鼠标左键时窗口的实体才被正真移动到虚线框所指向的位置处。那么,能否直接移动窗口实体而不出现虚线框呢?答案是肯定的。实际上,操作系统准备了两种移动窗口的方式,一种是有虚线框,另一

8、种则是没有虚线框,只是Windows系统默认的是有虚线框。不过,如果我们在上述示例代码中再添加下列语句:16SystemParametersInfo(SPI_SETDRAGFULLWINDOWS,true,NULL,0);即:caseWM_LBUTTONDOWN:SystemParametersInfo(SPI_SE

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。