如何扑捉到WM_NCLBUTTONUP(OnNcLButtonUp)消息
2012-12-29 04:06
706 查看
在点击标题栏,一直获取不到WM_NCLBUTTONUP消息。查了一下MSDN,说是当在非客户区点击鼠标时,窗口可以截获WM_NCLBUTTONDOWN,然后可以截获WM_ENTERSIZE消息,然后该窗口就被SetCapture(不再产生非客户区的消息了;同时所有的鼠标消息,即便鼠标不在这个窗口上的操作,也被传到这个窗口的窗口函数来处理。我一直没有搞清楚后面一条的应用场景),然后进入moving
or sizing modal loop了, 这个时候,当前窗口就收不到任何的鼠标操作消息了,一直到鼠标左键松开为止。左键松开的时候,发的也是WM_LBUTTONUP消息,而且该消息也不能被窗口截获。因为还没有退出moving or sizing modal loop。一直到WM_LBUTTONUP之后,再有一个WM_EXITSIZEMOVE消息,才标志着正式退出了moving or sizing modal loop,又回到了主窗口的消息循环。WM_EXITSIZEMOVE消息也是可以被主窗口截获的,所以可以在这个消息的时候适当做一些工作,扑捉到WM_NCLBUTTONUP消息。
主要思路就是在窗口类中定义一个变量m_bNCLBDOWN,当检测到WM_NCLBUTTONDOWN消息时,该变量置true
void CRedcolorDlg::OnNcLButtonDown(UINT nHitTest, CPoint point)
{
// TODO: Add your message handler code here and/or call default
m_bNCLBDOWN = TRUE; //树标志
CDialog::OnNcLButtonDown(nHitTest, point);
}
然后在检测到WM_EXITSIZEMOVE消息时(表示已经释放鼠标左键了,系统要退出moving or sizing modal loop),模拟发送一个WM_NCLBUTTONUP消息给主窗口即可,同时倒掉m_bNCLBDOWN,以备下次使用。
LRESULT CRedcolorDlg::OnExitSize(WPARAM, LPARAM)
{
if(m_bNCLBDOWN)
{
PostMessage(WM_NCLBUTTONUP,0,0);
m_bNCLBDOWN = FALSE; // 倒掉
}
return 0;
}
在VC中需要手工添加对消息WM_EXITSIZEMOVE的映射关系。
ON_MESSAGE(WM_EXITSIZEMOVE,OnExitSize)
然后,你就可以在WM_NCLBUTTONUP的消息映射函数中做各种工作了,这种方法应该是最简单的了。
or sizing modal loop了, 这个时候,当前窗口就收不到任何的鼠标操作消息了,一直到鼠标左键松开为止。左键松开的时候,发的也是WM_LBUTTONUP消息,而且该消息也不能被窗口截获。因为还没有退出moving or sizing modal loop。一直到WM_LBUTTONUP之后,再有一个WM_EXITSIZEMOVE消息,才标志着正式退出了moving or sizing modal loop,又回到了主窗口的消息循环。WM_EXITSIZEMOVE消息也是可以被主窗口截获的,所以可以在这个消息的时候适当做一些工作,扑捉到WM_NCLBUTTONUP消息。
主要思路就是在窗口类中定义一个变量m_bNCLBDOWN,当检测到WM_NCLBUTTONDOWN消息时,该变量置true
void CRedcolorDlg::OnNcLButtonDown(UINT nHitTest, CPoint point)
{
// TODO: Add your message handler code here and/or call default
m_bNCLBDOWN = TRUE; //树标志
CDialog::OnNcLButtonDown(nHitTest, point);
}
然后在检测到WM_EXITSIZEMOVE消息时(表示已经释放鼠标左键了,系统要退出moving or sizing modal loop),模拟发送一个WM_NCLBUTTONUP消息给主窗口即可,同时倒掉m_bNCLBDOWN,以备下次使用。
LRESULT CRedcolorDlg::OnExitSize(WPARAM, LPARAM)
{
if(m_bNCLBDOWN)
{
PostMessage(WM_NCLBUTTONUP,0,0);
m_bNCLBDOWN = FALSE; // 倒掉
}
return 0;
}
在VC中需要手工添加对消息WM_EXITSIZEMOVE的映射关系。
ON_MESSAGE(WM_EXITSIZEMOVE,OnExitSize)
然后,你就可以在WM_NCLBUTTONUP的消息映射函数中做各种工作了,这种方法应该是最简单的了。
相关文章推荐
- bug分享 - 收不到WM_NCLBUTTONUP消息
- 关于WM_NCLBUTTONUP消息
- VC如何禁止双击标题栏 - WM_NCLBUTTONDBLCLK消息
- 关于采用默认方式处理WM_NCLBUTTONDOWN消息而“无法”产生WM_NCLBUTTONUP消息的问题
- WM_NCLBUTTONDOWN+HTCAPTION消息移动一个窗口
- MFC一个解决自己发送WM_NCLBUTTONDOWN消息后收不到WM_ONLBUTTONUP的方法
- WM_NCLBUTTONDOWN+HTCAPTION消息移动一个窗口
- C# 使用WM_NCLBUTTONDOWN消息实现任意位置移动窗体
- 当鼠标移动到界面外面, 如何继续得到WM_LBUTTONUP消息
- WM_NCLBUTTONUP不正常响应
- 关于在标题栏不触发WM_NCLBUTTONUP事件的替代方法(C#)
- 关于WM_NCLBUTTONUP
- TControl.WMLButtonUp的inherited的作用——是为了给子类控件新的处理消息的机会
- 关于CStatic类不能重载ON_WM_LBUTTONDOWN消息的问题
- 如何在C#用WM_COPYDATA消息来实现两个进程之间传递数据
- 如何在VS2008中添加WM_INITDIALOG消息映射
- VC6.0 Dialog 如何添加 WM_ERASEBACKGROUND 消息
- MFC简单皮肤颜色绘制(SetDialogBkColor不再被支持,看 WM_CTLCOLOR消息如何百变控件颜色)
- HTCAPTION与WM_NCLBUTTONDBLCLK及最大化的关系
- WM_NCLBUTTONDOWN和WM_LBUTTUNDOWN有什么区别