У меня есть правильная идея с использованием 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
Другие вопросы по тегам