网站已经改版为Wordpress版本,这里是旧版本的快照,请不要在页面中留言.

【MFC】非客户区(NC)的左键弹起消息的获取


//首先我们先看一下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  消息是不是可以执行了~~



  • 标签:
  • MFC非客户区域
  • 标题栏左键弹起消息
网站已经改版为Wordpress版本,这里是旧版本的快照,请不要在页面中留言.