关于采用默认方式处理WM_NCLBUTTONDOWN消息而“无法”产生WM_NCLBUTTONUP消息的问题

本文探讨了在自定义标题栏时遇到的问题,即在处理WM_NCBUTTONDOWN消息并添加默认处理后,无法产生WM_NCBUTTONUP消息以实现窗口移动功能。通过在处理WM_SYSCOMMAND消息时发送WM_NCLBUTTONUP消息,可以解决此问题。同时,文章还讨论了类似情况下的WM_RBUTTONDOWN与WM_RBUTTONUP消息处理,以及解决这些情况的通用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题产生:打算自己绘制标题栏,去掉有了系统菜单,就剩下了一个光秃秃的标题栏,在完成绘制关闭按钮后,作了以下事情:

1:响应WM_NCBUTTONDOWN消息

2:响应WM_NCBUTTONUP消息。

由于我用的Win32,没用MFC,所以在每处理完消息后就直接返回0;

这看似正常,既能够响应WM_NCBUTTONDOWN消息,也能够响应WM_NCBUTTONUP消息,但是问题出现了,

那就是我们不能通过标题栏移动窗口了,于是在响应WM_NCBUTTONDOWN的添加上了默认处理该消息的函数DefWindowProc,

这样就可以移动窗口,但是却不能产生WM_NCBUTTONUP消息,除非鼠标双击。


为了解决采用默认方式处理WM_NCBUTTONDOWN消息而不能产生WM_NCBUTTONUP消息,参考了别人的意见,

就是在对WM_SYSCOMMAND消息进行处理,代码如下:

if (wParam & 0xfff0 == SC_MOVE)
         PostMessage(hWnd,WM_NCLBUTTONUP, HTCAPTION, lParam);   // 发送WM_NCLBUTTONUP消息
return DefWindowProc(hWnd, uMsg, wParam, lParam);//采用默认处理


就是发送一个WM_NCBUTTONUP消息,但是此时对WM_BUTTONDOWN消息有默认处理的代码,如果对该消息最后不进行默认处理,也不能得到有效的效果。

但是,尽管这样处理,还是有一定的问题,例如,将窗口不停的移动(移动----》释放-----》移动........如此下去),后面的其他窗口会出现或不显示的状态。

所以,解决该问题的方法可以在WM_LBUTTONDOWN消息中最后采用默认处理;也可以不用,但是必须还要处理由此引出的一系列问题

如:要解决移动窗口问题,并且缺少很多默认处理的操作,这样在以后也会带来很多不变的操作。

最后,对于WM_RBUTTONDOWN与WM_RBUTTONUP消息也有类似情况,其原因应该都是默认处理所造成的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值