У меня есть правильная идея с использованием SetCapture() для безоконный флажок?
Элемент управления My Table использует флажки без окон (поскольку здесь может быть произвольное количество флажков). Щас пользуюсь TrackMouseEvent(TME_LEAVE)
и вручную проверять, находится ли мышь в прямоугольнике флажка во время WM_LBUTTONUP
, В моем коде помечены TODO для крайних случаев, которые это вызывает, таких как отсутствие WM_LBUTTONUP
когда мышь покинула клиентскую область.
Теперь я замечаю, что сегодня в The Old New Thing говорится, что кнопки используют захват мыши. Это заставило меня задуматься, и, посмотрев на это, захваты мыши подойдут так, как мне нужно; если мои предположения верны, он будет обрабатывать различные крайние случаи, которые я упомянул выше, и будет более точным в целом.
В частности, я делаю следующие предположения: я должен отказаться от любых связанных с захватом операций на WM_CAPTURECHANGED
даже если выполнены все остальные условия. Я получу WM_CAPTURECHANGED
после ReleaseCapture()
, После SetCapture()
Я всегда буду заканчиваться либо WM_LBUTTONUP
или WM_CAPTURECHANGED
, что наступит раньше.
Я прочитал и MSDN, и несколько статей, найденных Гуглингом "setcapture правильное использование"; Я просто хочу убедиться, что у меня есть правильная идея и я буду правильно ее реализовывать. Я?
on WM_LBUTTONDOWN
if the button is in a checkbox
SetCapture()
mark that we're in checkbox clicking mode
on WM_MOUSEMOVE
if we are in checkbox clicking mode
draw the checkbox in the pressed state
on WM_LBUTTONUP
if we are in checkbox clicking mode
leave checkbox clicking mode
THEN call ReleaseCapture(), so we can ignore its WM_CAPTURECHANGED
if the mouse was released in the same checkbox
toggle it
on WM_CAPTURECHANGED
if we are in checkbox clicking mode
abandon checkbox clicking mode and leave the checkbox untoggled, even if the mouse is hovering over the checkbox
У меня есть правильная идея здесь? И в частности, это мой порядок операций для WM_LBUTTONDOWN
правильный? Благодарю.
1 ответ
То, что вы сказали, в основном правильно, хотя настоящий флажок отслеживает WM_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