普通的Windows应用程序窗口都具有统一的窗口风格,它们一般都包括:用户区和非用户区两部分。非用户区包括标题条、窗口边框、最大化按钮、最小化按钮、关闭按钮和系统默认的快捷键及鼠标支持等。利用鼠标的左键通过拖动窗口的标题条可以在屏幕上任意移动整个窗口,当光标停止在窗口边框上时可以改变窗口的大小。在一些比较经典的软件中,有一类特殊的无标题条的窗口。这种窗口不需要改变窗口的大小,但必须具有窗口客户区域的拖动功能,典型的例子有 Windows中的IME输入法应用程序、中文之星以及一些第三方开发的输入法平台等。由于普通窗口的拖动功能是由系统来完成的,编制一般的应用程序时根本无须考虑客户区域拖动问题,但对于无标题条的Windows应用程序,拖动功能就要靠开发者自己来实现了。
实现 思路
既然Windows已经实现了不错的窗口拖动功能,我们可以通过利用系统这种默认的实现来完成无标题条的窗口的拖动。仔细分析一下,不难发现,无标题条窗口的客户区大都只是作为控件的载体(最常见到的是按钮控件),当鼠标位于其窗口中时(鼠标变为十字箭头)可以拖动整个窗口,而且窗口的大小不可改变,这很像一般窗口标题条的功能,因此只要将无标题条窗口模拟成标题条,使系统将其“误认为”是窗口的标题条,就可以利用系统的默认实现来完成无标题条窗口的拖动了。
那么如何使系统将无标题条窗口的客户区“误认为”是窗口的标题条呢?重载函数:
UINT CWnd::OnNcHitTest(CPoint point)
每当鼠标在窗口中移动,那么MFC的应用程序框架会发送消息WM_NCHITTEST,由该函数来完成对消息处理。其中参数point鼠标当前所在位置坐标,函数的返回值为: