Winapi 对于无窗口复选框使用SetCapture()我有正确的想法吗?

Winapi 对于无窗口复选框使用SetCapture()我有正确的想法吗?,winapi,checkbox,mousecapture,Winapi,Checkbox,Mousecapture,我的表格控件使用无窗口复选框(因为这里可以有任意数量的复选框)。现在,我使用TrackMouseEvent(TME_left)并在WM_LBUTTONUP期间手动检查鼠标是否位于复选框rect中。我在代码中标记了导致边缘情况的TODO,例如当鼠标离开客户端区域时,缺少WM_LBUTTONUP 现在我注意到按钮使用鼠标捕捉。这让我思考,在仔细研究之后,鼠标捕捉会更适合我的需要如果我的假设是正确的它将处理我上面提到的各种边缘情况,并且总体上更为正确 特别是,我所做的假设是:我应该放弃对WM\u CA

我的表格控件使用无窗口复选框(因为这里可以有任意数量的复选框)。现在,我使用
TrackMouseEvent(TME_left)
并在
WM_LBUTTONUP
期间手动检查鼠标是否位于复选框rect中。我在代码中标记了导致边缘情况的TODO,例如当鼠标离开客户端区域时,缺少
WM_LBUTTONUP

现在我注意到按钮使用鼠标捕捉。这让我思考,在仔细研究之后,鼠标捕捉会更适合我的需要如果我的假设是正确的它将处理我上面提到的各种边缘情况,并且总体上更为正确

特别是,我所做的假设是:我应该放弃对
WM\u CAPTURECHANGED
的任何捕获相关操作,即使满足所有其他条件。在
ReleaseCapture()
之后,我将获得一个
WM\u CAPTURECHANGED
。在
SetCapture()
之后,我将始终以
WM\u LBUTTONUP
WM\u CAPTURECHANGED
结束,以先到者为准

我已经阅读了MSDN和通过谷歌搜索“setcapture正确使用”找到的一些文章;我只是想确保我有正确的想法,并且能够正确地实施。是吗

WM_LBUTTONDOWN上的

如果按钮位于复选框中
SetCapture()
标记我们处于复选框单击模式
关于WM_MOUSEMOVE
如果我们处于复选框单击模式
在按下状态下绘制复选框
关于WM_LBUTTONUP
如果我们处于复选框单击模式
保留复选框单击模式
然后调用ReleaseCapture(),这样我们就可以忽略它的WM_CAPTURECHANGED
如果在同一复选框中释放鼠标
切换它
关于WM_CAPTURECHANGED
如果我们处于复选框单击模式
放弃复选框单击模式,保持复选框不动,即使鼠标悬停在复选框上

我的想法对吗?特别是,我对
WM_LBUTTONDOWN
的操作顺序正确吗?谢谢。

您所说的基本上是正确的,尽管真正的复选框在“单击模式”下跟踪
WM\u MOUSEMOVE
,并在鼠标离开复选框时以其原始状态显示复选框。因此,为了模仿,您应该:

on WM_MOUSEMOVE
    if we are in checkbox clicking mode
        if mouse is over the checkbox
            draw the checkbox in the pressed (toggled) state
        else
            draw the checkbox in the original state

谢谢我不会在
WM\u CAPTURECHANGED
本身中调用
ReleaseCapture()
,对吗?(第一次忘了这一点)不,如果你已经更改了
WM\u CAPTURECHANGED
你已经丢失了捕获,所以不需要再次释放它。好的。我现在已经实现了
SetCapture()
,一切正常。再次感谢!