1
使无标题栏窗口跟随鼠标移动[有虚框]
正常情况下,当鼠标光标在窗口的标题栏上按下鼠标左键时将有下列事件发生:
▲ 系统将向该窗口发送 WM_NCLBUTTONDOWN 消息,并传回一个 HTCAPTION 标识值,该标
识表示当前鼠标光标指针已指向窗口标题栏。
▲ WM_NCLBUTTONDOWN 消息将传送到该窗口的窗口过程,并由其中的 DefWindowProc()函
数来负责处理该消息。
▲ 鉴于用户在窗口标题栏内按下鼠标左键并拖动光标的动作发生,在 DefWindowProc()函数中
默认的 WM_NCLBUTTONDOWN 消息事件中,将执行窗口随同鼠标光标一起移动的操作。
作为练习,若在窗口的回调函数(即窗口过程)中设置下列语句:
case WM_NCLBUTTONDOWN:
return 0;
又将如何呢?这时若同样在窗口标题栏内按住鼠标左键并移动光标时,而此时窗口却并不随同
鼠标光标一起移动了。这是因为,上述语句拦截了 WM_NCLBUTTONDOWN 消息,使之不能传到
DefWindowProc()函数中去的缘故。
这里移动窗口并不是真正地移动窗口实体,而是先移动一个指示框(一个虚线框),等确定好移
动的位置后,放开鼠标左键后窗口实体才被真正移动到虚线框所在位置处。
这样处理的好处是效率高,占用系统资源少。若是直接移动窗口实体的话,则窗口在移动的过
程中,需要不停的画出窗口实体、销毁窗口实体、又在新的位置重新画出窗口实体。这就非常耗费
系统资源。
不过,当程序窗口没有窗口标题栏时,就不能按上述常规方法来移动窗口实体了,下面给出的
方法可以在窗口标题栏以外的位置(准确的讲,是在窗口的客户区域内的任意位置)来移动程序窗口。
1、使用 WM_NCLBUTTONDOWN
在窗口客户区内移动窗口(有虚框)。
WM_NCLBUTTONDOWN
nHittest = (INT) wParam; // 返回一个标识值
pts = MAKEPOINTS(lParam); // 返回光标的当前位置
上面已经讲过,当用户将鼠标光标指向窗口标题栏并按下鼠标左键时,系统将向该窗口的回调
函数发送 WM_NCLBUTTONDOWN 消息事件,通知回调函数中的 DefWindowProc()函数配合用户的
操作(即按下鼠标左键并拖动光标)来执行既定任务(即移动窗口实体)。
这里我们就得到了这样的一个启示,那就是只要向窗口发送 WM_NCLBUTTONDOWN 消息,并