我使用了OnNcLButtonDown可以响应消息,之后使用OnNcLButtonUp却不能响应单击消息,但双击能响应。
网上找了些资料,说因为窗口管理器在处理 OnNcLButtonDown 的时候捕捉了鼠标焦点,即使用了 SetCapture 函数,在捕捉了鼠标焦点后,窗口就不会发送 WM_NCLBUTTONUP 消息而会发送 WM_LBUTTONUP 消息。
解决办法:
在你的CXXDialog中的消息处理函数OnSysCommand()(对WM_SYSCOMMAND的响应)添加下面代码:
void CXXXDialog::OnSysCommand(UINT nID, LPARAM lParam)
{
if( (nID & 0xFFF0) == IDM_ABOUTDLG )
{
// 省略...
}
else
{
// 这是本来有的
CDialog::OnSysCommand(nID, lParam);
// 加入下面这2行
if( (nID & 0xFFF0) == SC_MOVE )
PostMessage(WM_NCLBUTTONUP, nID, lParam);
}
}
当DLG收到WM_NCLBUTTONDOWN后, 却省的DefWindowProc会发送WM_SYSCOMMAND, 然后在处理WM_SYSCOMMAND时, 还会有一些消息被发送并处理, 会使WM_NCLBUTTONUP不会被收到, 所以在WM_SYSCOMMAND的处理返回后, 再补发一个WM_NCLBUTTONUP