1.鼠标左键释放时没有响应WM_NCLBUTTONUP 消息?
在鼠标左键单击窗体的非客户区时,OnNcLButtonUp 函数未响应,原因是当DLG收到WM_NCLBUTTONDOWN后, 缺省的DefWindowProc会发送WM_SYSCOMMAND, 然后在处理WM_SYSCOMMAND时, 还会有一些消息被发送并处理,WM_NCLBUTTONUP不会被收到, 所以在WM_SYSCOMMAND的处理返回后, 再补发一个WM_NCLBUTTONUP消息。
void CUseMFCDllDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialogEx::OnSysCommand(nID, lParam);
//以上代码是创建对话框类时,默认实现的
//必须写上nID & 0xFFF0,否则比较的结果始终为false
if ((nID & 0xFFF0) == SC_SIZE)
{
PostMessage(WM_NCLBUTTONUP, nID, lParam);
}
}
}
然后再实现鼠标左键在非客户区释放后的操作:
void CUseMFCDllDlg::OnNcLButtonUp(UINT nHitTest, CPoint point)
{
/*解决在鼠标左键按下并拖动窗口改变窗口大小时,无法响应鼠标左键释放消息:
* 在 OnSysCommand 中调用基类OnSysCommand 函数后,再次手动发送一个WM_NCLBUTTONUP消息
* 即可响应左键释放消息,但是仅在 SC_SIZE 改变有效
*/
//to do some thing
CDialogEx::OnNcLButtonUp(nHitTest, point);
}