在接触到WM_NCLBUTTONUP这个消息时,大家应该都能猜到这是一个非客户区域的左键抬起的消息,在MSDN里的解释也是这样的,原文如下:
WM_NCLBUTTONUP:
The WM_NCLBUTTONUP message is posted when the user releases the left mouse button while the cursor is within the nonclient area of a window. This message is posted to the window that contains the cursor. If a window has captured the mouse, this message is not posted.
但是在使用中发现,当我们重载了这个消息,然后在非客户区域抬起左键时,根本就没有出发这个消息。反而是在非客户区双击左键才出发这个消息。至于为什么会这样,用Spy++看,当左键单击标题栏的时候,先发生的是WM_NCLBUTTONDOWN,如果点住不放超过一段时间,系统认为将要发送拖动事件,消息改为WM_MOUSEMOVE,最后放开左键得到的消息是WM_NCMOUSEMOVE。就没有WM_NCLBUTTONUP这个消息,到现在我也没找到真正的原因,或许是MS的Bug吧!
这种现象相比给我们使用带来了很大的不便,于是乎我就在网络里找啊找啊。终于找到了一个解决办法:
在OnSysCommand函数里处理一下,手动发一个WM_NCLBUTTONUP消息,具体代码如下:
void CDlgSkinDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
if( (nID & 0xFFF0) == SC_MOVE )
{
PostMessage(WM_NCLBUTTONUP, HTCAPTION, lParam);
}
}
}
阅读(4208) | 评论(0) | 转发(0) |