Поймать сообщения OnMouseMove для контроля редактирования в окне, созданном creatialog? - PullRequest
1 голос
/ 22 февраля 2020

У меня есть диалоговое окно, которое создается с помощью CreateDialog().

В этом диалоговом окне находится элемент управления для редактирования текста, который создается автоматически при вызове CreateDialog(), однако я не могу поймать OnMouseMove сообщений для него - только его родительское окно (элементов управления, а не диалоговое окно). CreateDialog() позволяет вам только установить функцию процедуры для основного диалога (не для подобъектов, как элементы управления редактирования), и если я ловлю там сообщения OnMouseMove, они запускаются только для движения мыши в самом главном диалоге (где угодно здесь нет элемента управления, например кнопки, поля для редактирования текста и т. д. c).

Если не создавать окно вручную с помощью CreateWindowEx() (и всех подчиненных объектов), есть ли способ перехватить сообщения OnMouseMove, связанные с указанным c элементом управления редактированием текста, по его идентификатору или чему-то еще? ? У меня есть дескриптор, извлеченный с помощью GetDlgItem().

. В конечном итоге я пытаюсь выполнить sh, чтобы прочитать текст под курсором мыши и отобразить соответствующую подсказку, если слово распознано / сопоставлено, и Я определенно открыт для других альтернатив, если у вас есть какие-либо идеи!

Вот базовый c код:

Создание диалога с использованием шаблона DBG_DLG для определения элементов управления

hDbg = CreateDialog(hCurInst, TEXT("DBG_DLG"), 0, DbgDlgProc);

Шаблон DBG_DLG определен в файле .rc проекта. Я не смог найти простой способ вставить этот код здесь, но у него есть определенный элемент управления для редактирования текста, который я пытаюсь поймать с идентификатором ID_OP_ED.

Соответствующий код из DbgDlgProc(), который делает НЕ работает, а только перехватывает сообщения, связанные с основным диалогом, а не сами элементы управления. При наведении курсора на элементы управления эта процедура не перехватывает сообщения.

BOOL CALLBACK DbgDlgProc(
                         HWND hwnd,
                         UINT message,
                         WPARAM wParam,
                         LPARAM lParam
                         )
{

    switch(message)
    {
    case WM_INITDIALOG:

        return TRUE;
    case WM_MOUSEMOVE:
        OnMouseMove(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam), (DWORD)wParam);
        return FALSE;

1 Ответ

0 голосов
/ 22 февраля 2020

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

Подробнее см. В MSDN:

Элементы управления подклассами

...