Vinod Kc Ответов: 1

Как узнать, если мышь вошла и вышла в какой - либо элемент управления в win32 ?


Всем привет,
Я пишу библиотеку GUI с использованием API win 32. Мой лагуаж-ним, но здесь дело не в этом.
Для подражания vb.net стиль, я разработал метод, управляемый событиями, в этой библиотеке. Каждый класс управления в моей библиотеке имеет несколько открытых членов, называемых событиями. И все они-Уинты. любить --
ButtonClass.click = BN_CLICKED
FormClass.click = WM_LBUTTONDOWN
Каждый класс имеет функцию AddHandler. Это и есть подпись.
Метод addhandler(ЭВТ СПП)
-evt = события
-pFn = указатель функции
Таким образом, этот AddHandler добавит все пользовательские функции и соответствующие сообщения в список. Затем в функции WndProc я могу выполнить цикл по этому списку и вызвать соответствующую функцию. Пока все вроде бы в порядке.
Но я хочу, чтобы мои классы управления также обрабатывали события ввода, наведения и выхода мыши. Это создало проблему. Я не могу найти общее сообщение ввода мыши управления в win api. Я знаю, что эта кнопка использует BCN_HOTITEMCHANGE, и она сработала для меня. Но я не могу найти решение, которое применимо для каждого элемента управления. Как решить эту проблему.
Я только что протестировал его с помощью TrackMouseEvent. Это был мой тестовый сценарий-
1. когда указатель мыши нависает над любым элементом управления, я получаю сообщение WM_MOUSELEAVE. И когда указатель возвращается в клиентскую область, я получаю сообщение WM_MOUSEMOVE.
2. Итак, я начал отслеживать мышь в WM_MOUSELEAVE и перестал отслеживать в WM_MOUSEMOVE. Мое намерение состояло в том, чтобы получить сообщение о наведении мыши на верхнюю часть каждого элемента управления. Но это не сработало так, как задумывалось. Кто-нибудь поможет ?
Немного дополнительной информации--
1. для всех классов управления я создал сообщения CTL_MOUSE_ENTER, CTL_MOUSE_HOVER, CTL_MOUSE_LEAVE.
2. Затем я добавил указатели функций для этих событий и сохранил их в списке.
3. В WndProc, который, я хочу, чтобы перебрать этот список и вызвать функцию.
4. Чтобы найти, какой элемент управления находится под указателем мыши, я использую функции GetMousePos &ScreenToClient.
5. И тогда я попытался с функцией WindowFromPoint, но не работал.
6. Затем я попытался найти элемент управления с помощью прямой линии элемента управления, но это не сработало.
Теперь все мои эксперименты провалились.

Что я уже пробовал:

proc TrackMouse*(handle : HWND) = 
    var lpTME : TTRACKMOUSEEVENT
    lpTME.cbSize = cast[DWORD](sizeof(TTRACKMOUSEEVENT))
    lpTME.dwFlags = TME_HOVER or TME_LEAVE 
    lpTME.dwHoverTime = 100 #HOVER_DEFAULT
    lpTME.hwndTrack = handle
    discard COMCTL32_TrackMouseEvent(lpTME)

Richard MacCutchan

Лучший способ продолжить это - получить трекер сообщений, такой как Spy++. Затем вы можете запустить свой код и посмотреть, какие именно сообщения генерируются в каждой точке.

Vinod Kc

@Ричард MacCutchan,
Спасибо за ответ. Я разделил этот элемент управления на подклассы, и он сработал.

1 Ответов

Рейтинг:
0

Michael Haephrati

Вы должны использовать событие WM_KILLFOCUS, которое возникает непосредственно перед тем, как мышь выходит из элемента управления.

Видеть: Сообщение WM_KILLFOCUS - приложения для Windows | Microsoft Docs[^]