//首先我们先看一下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.
简而言之就是说,当 user 在非客户区域 释放鼠标左键[鼠标左键弹起] 的时候,该消息将会被 post到消息队列
对于大多数消息,我们直接在对应的消息响应函数中就可以对该消息进行处理了,但是 对于 WM_NCLBUTTONUP 这个消息来说,可真是一个令人头疼的问题,如果你直接重载这个消息,那么你将会发现 非客户区域 的左键弹起 并没有产生 WM_NCLBUTTONUP 这个消息,反而如果我们的 非客户区域的 双击消息 却产生了 WM_NCLBUTTONUP 消息;
收集了一下网上的资料,都说这是 微软的 BUG,
其实这是一个消息的临界问题,
对于一个窗口,我们可以通过左键单击其标题栏对窗口进行拖动,拖动时会发送 ON_MOVE的消息,,而对于拖动事件,系统是通过检测 鼠标左键按下不弹起的时间来判断的,,
其实 WM_NCLBUTTONUP 消息的症结就在这里,由于拖动时间的检测时间较短,对于一般的单击时间就会被识别为拖动事件,就变成了 发送 ON_MOVE的消息,WM_NCLBUTTONUP 消息就没了 ==
这里 给出一种解决方案、、既然系统没有发送 WM_NCLBUTTONUP 的消息,那么我们就手动发送一个 WM_NCLBUTTONUP 消息
//示例代码
//在系统的SystemCommand的处理中手动post WM_NCLBUTTONUP 消息
//下面是一个 CDialog的程序代码片段
void CMyDialog::OnSysCommand(UINT nID, LPARAM lParam) { //这里是 对于系统菜单的 "关于菜单"消息的处理,就是弹出一个 关于的对话框 if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } // 默认情况下 除了 关于菜单的消息, //其余的SystemCommad消息都默认传递到父类的函数中去处理 else { CDialog::OnSysCommand(nID, lParam); //添加我们的post消息,其实就是在 //SC_MOVE消息之后post一个 WM_NCLBUTTONUP 消息 if((nID & 0xFFF0) == SC_MOVE ) { PostMessage(WM_NCLBUTTONUP, nID, lParam); } } }
看一下 WM_NCLBUTTONUP 消息是不是可以执行了~~