MFC: как поймать установленный фокус каждого элемента управления диалога в одной функции

У меня есть «n» диалогов, которые имеют одинаковый базовый диалог. Каждый диалог имеет свои собственные элементы управления

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

В базовом диалоге, как мне установить фокус сообщения каждого элемента управления и, например, дать окно сообщения с

text("Hello I got focus, my ID is %d")?

1

Решение

В соответствии с эта ТАКАЯ статья, Вы можете перехватить сообщение WM_SETFOCUS.

Вы можете получить контрольный идентификатор, используя GetDlgCtrlID с hwnd вернулся на крючок.

Но остерегайтесь выскакивать MessageBox, это изменит фокус и вызовет вашу ловушку, заставляя ее зацикливаться!

0

Другие решения

Как уже сказал Джерри, сделайте хук, обработчик родительского окна через GetParent () а также SendMessage (hParentWND, WM_MESSAGE, lParam, wParam).
Конечно, вы должны обработать WM_MESSAGE в родительском окне.
Кстати, рамки звонков OnSetFocus функция, когда окно получило фокус.

0

Самый простой способ — использовать классический метод создания подклассов. Проблема в том, что WM_SETFOCUS не прокачивается через сообщение Loop, поэтому PreTranslateMessage не поможет.

Есть несколько хороших классов, которые помогают выполнять дополнительные подклассы, не мешая работе MFC.
Пол Ди Ласкья написал CSubclassWnd. PJ Naughter написал CHookWnd. И с ATL есть CWindowsImpl.

Все эти классы позволяют легко создавать дополнительные подклассы, даже если MFC уже подклассирует окно.

Вы также можете использовать «стандартное наследование» GetWindowLong / SetWindowLong.

0
По вопросам рекламы [email protected]