eDit
感谢您的前两个答复,我尝试在Nclbuttondown中调用发行版,但没有效果(实际上,它返回了null,表明没有捕获的捕获)。我只能假设基类(DEF窗口Proc)功能可以设置捕获。我将在星期一进行调查...
我也有同样的问题。问题确实是,左键单击窗口字幕开始拖动,因此鼠标捕获,从而防止WM_NClButtonUp到达。
解决方案是覆盖wm_nchittest:
LRESULT CALLBACK WndProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam)
{
switch (nMsg)
{
...
case WM_NCHITTEST:
Point p(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam);
ScreenToClient(p);
if (myButtonRect.Contains(p))
{
return HTBORDER;
}
break;
}
return DefWindowProc(hWnd, nMsg, wParam, lParam);
}
因此,您从本质上告诉Windows,按钮所占据的区域不是窗口标题的一部分,而是非客户区域(HTBORDER)的非特异性部分。
footnote:如果您已调用setCapture(),尚未称为reareSecapture()当您期望WM_NClButtondown消息进入时,即使上述更改也不会到达。这可能会很刺激,因为在与此类自定义按钮交互过程中捕获鼠标是正常的,因此您可以取消单击/突出显示鼠标离开窗口。但是,作为使用捕获的替代方法,您可以考虑使用短(例如100毫秒)间隔的settimer()/killtimer(),这不会导致WM_NClButtonUp消息消失。
我建议您在该窗口上运行间谍++,它是孩子,然后尝试找出谁获取按钮的消息。
是如何修复它 - 不查看实际代码而无法帮助您。您必须弄清楚罪魁祸首是谁并查看其代码。
要添加到Franci Penov的答案,单击标题栏被解释为重新定位窗口的阻力的开始。窗口正在捕获鼠标,因此可以执行阻力。由于无法拖动最大化的窗口,因此会跳过捕获,并正常消息路由。
wm_nclbuttondown {code block}