防止用户进行正常的GUI 操作
2006-07-23 11:30:33 来源:WEB开发网当用户在标题框中点击鼠标时,Windows发送WM_NCHITTEST消息。默认的窗口过程检查鼠标坐标并返回一个特定的鼠标点击测试代码(HIT-TEST CODE)。例如,如果鼠标是在标题框中,默认的窗口过程返回HTCAPTION。如果鼠标是在左边界或右边界,默认的窗口过程分别返回HTLEFT或HTRIGHT。根据这些返回的代码值。Windows进行窗口移动或调整窗口大小的操作。
通过重载WM_NCHITTEST消息处理函数限制窗口的移动和调整窗口大小,返回值是由其它的值代替HTCAPTION、HTLEFT或HTRIGHT,那到底返回值是什么呢?首先可能想到返回HTNOWHERE,但这样的话会有一个问题:如果另一个窗口覆盖在你的窗口上,这时单击你的应用窗口的标题框的话,什么事也不会发生。我的意思是Windows不会激活你的应用程序窗口。那返回HTTRANSPARENT如何呢?也不行。HTTRANSPARENT和HTNOWHERE都使得现存的窗口框架状态不明确。
正确的返回值应该是HTBORDER,当用户单击粗框架窗口(可调整窗口大小)的边界时,默认的窗口过程返回相同的值。如果返回HTBORDER,Windows激活应用程序窗口时就不会初始化任何移动窗口或调整窗口大小的操作。
本文附带了一个示例工程NoSize,这个程序示范了如何实现以上讨论的内容,所有的工作都在CMainFrame类中完成。其中关键的函数是CMainFrame ::OnNcHitTest。它将所有不接受的点击测试代码映射到HTBORDER。
UINT CMainFrame::OnNcHitTest(CPoint point)
{
// 获得鼠标位置代码。
UINT hit = CFrameWnd::OnNcHitTest(point);
// 不接受以下的代码值,将它们映射到HTBORDER
static char DisallowCodes[] = {
HTLEFT,HTRIGHT,HTTOP,...,
HTSIZE,HTCAPTION };
return strchr(DisallowCodes, hit)) ? HTBORDER: hit;
}
更多精彩
赞助商链接