Chinaunix首页 | 论坛 | 博客
  • 博客访问: 755957
  • 博文数量: 128
  • 博客积分: 7079
  • 博客等级: 少将
  • 技术积分: 1326
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-16 08:53
文章分类

全部博文(128)

文章存档

2011年(3)

2010年(12)

2009年(9)

2008年(23)

2007年(61)

2006年(20)

我的朋友

分类: C/C++

2008-02-21 14:49:19

在接触到WM_NCLBUTTONUP这个消息时,大家应该都能猜到这是一个非客户区域的左键抬起的消息,在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.
  但是在使用中发现,当我们重载了这个消息,然后在非客户区域抬起左键时,根本就没有出发这个消息。反而是在非客户区双击左键才出发这个消息。至于为什么会这样,用Spy++看,当左键单击标题栏的时候,先发生的是WM_NCLBUTTONDOWN,如果点住不放超过一段时间,系统认为将要发送拖动事件,消息改为WM_MOUSEMOVE,最后放开左键得到的消息是WM_NCMOUSEMOVE。就没有WM_NCLBUTTONUP这个消息,到现在我也没找到真正的原因,或许是MS的Bug吧!
  这种现象相比给我们使用带来了很大的不便,于是乎我就在网络里找啊找啊。终于找到了一个解决办法:
  在OnSysCommand函数里处理一下,手动发一个WM_NCLBUTTONUP消息,具体代码如下:
void CDlgSkinDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
 if ((nID & 0xFFF0) == IDM_ABOUTBOX)
 {
  CAboutDlg dlgAbout;
  dlgAbout.DoModal();
 }
 else
 {
  CDialog::OnSysCommand(nID, lParam);
  if( (nID & 0xFFF0) == SC_MOVE )
  {
   PostMessage(WM_NCLBUTTONUP, HTCAPTION, lParam);
  }
 }
}
 
  
  
阅读(4208) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~