более простой способ добиться движения мыши при управлении окнами в цикле WINDOW, чем создание подклассов - PullRequest
0 голосов
/ 01 февраля 2012

Прежде всего, да, я прочитал другие статьи (мне нравится ваше окно с похожим названием вопроса), мне просто любопытно, есть ли лучшие способы сделать это.

Проблема: При использовании эффектов или чего-либо еще, что вызывает отслеживание, WinAPI явно решил, что кнопки, изменения и, возможно, все другие общие элементы управления не передают WM_MOUSEMOVE своему родительскому дескриптору .Это бывает неудобно, когда пользователь, например, слишком долго (фактически перемещается) на кнопке и непреднамеренно инициируется событие .

Исходный вопрос: как решить эту проблему?

Ответ 1 : Подклассы.Довольно удобен и безопасен, но требует также некоторого времени, поэтому пропустите это сейчас.

Ответ 2: TrackMouseEvent + "if-conditioning" -> может быть медленным и, безусловно, становится очень сложным.

NoGo: Использование флагов уведомлений в качестве BS_NOTIFY для кнопок не работает, поскольку они заботятся о щелчках мыши и фокусировке.

ВОПРОС: Любые другие идеи?Windows 7 «тайно» ввел флаг для этого или какой-то программист знает хитрость, чтобы легче с ним справиться?

ПРИМЕЧАНИЕ: я не хочу кого-то раздражать.Я просто хочу спросить, прежде чем добавлять излишне много кода.

1 Ответ

0 голосов
/ 01 февраля 2012

Подклассы - безусловно, самый простой вариант.Если вы ищете более простой вариант, вы не найдете его.Как видно по ссылке, с минимальным количеством кода вы уже можете решить свою проблему.Если вы хотите иметь такую ​​функциональность, чтобы родительский дескриптор действительно передавал сообщение WM_MOUSEMOVE вверх по иерархии окон, просто сделайте его подклассом, тогда при обработке этого сообщения параметры перенаправляются на родительский.

Я немногонеясно, однако, о том, что вы подразумеваете под:

например - остается (фактически перемещается) слишком долго на кнопке, и событие непреднамеренно вызывается .

Например:

LRESULT CALLBACK ButtonProc(HWND hWnd, UINT uMsg, WPARAM wParam,
                               LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData)
{
    switch (uMsg)
    {
    case WM_MOUSEMOVE:
        SendMessage((HWND)dwRefData, uMsg, wParam, lParam);
    }

    return DefSubclassProc(hWnd, uMsg, wParam, lParam);
}

Предполагается, что вы передали родительский элемент HWND в dwRefData.

...