2017-01-07 3 views
1

Я передаю указатель на экземпляр экземпляра класса для элементов управления как lpParam и поймаю его при приеме WN_NCCREATE.CreateWindowEx lpParam для кнопки и т. Д. В WM_NCCREATE

Это сообщение не отправляется при создании элементов управления, таких как статические или кнопки (пока).

Таким образом, я создаю окно, статическое и кнопочное, регистрирует указатели экземпляров и получает только одно сообщение WN_NCCREATE с указателем на окна.

Вопрос: Как я могу получить переданный параметр?

В моей предыдущей попытке несколько лет назад я использовал std::map hwnd -> ptr, который отлично работал. В этой попытке я пытаюсь получить немного глубже в WinAPI и попробовать другой подход. Теперь я застрял в этом, результаты Google пока не помогли.

Должен ли я придерживаться карты или есть другое решение?

+2

Вы не можете перехватывать сообщения, отправленные системным элементам управления без их подклассификации, и к тому моменту, когда вы можете подклассифицировать элемент управления, он уже создан, и сообщение 'WM_NCCREATE' уже давно обработано. Что вы на самом деле пытаетесь сделать? Я почти уверен, что есть лучший способ. –

+0

Я пытаюсь превратить GUI в классы и использовать некоторые функции C++ nn, чтобы создать красивый API. Просто некоторые играют. Экземпляр каждого виджета имеет свой собственный wndproc, который отвечает за запуск событий. Наблюдаемый шаблон поля отвечает за отправку и получение сообщений, тогда член установлен и т. Д. Чтобы иметь член и proc, мне нужно идентифицировать экземпляр, чтобы я мог передать сообщение его wndproc. – Silberling

+0

Это не так, как работает обработка событий в стандартных элементах управления Windows. Для выполнения того, что вы хотите сделать, вам потребуется: a) написать все элементы управления с нуля или b) обработать события в процедурах окна вашего контейнера, перейдя в класс оттуда. – andlabs

ответ

1

Чтобы сделать то, что вы пытаетесь, вы можете сделать следующее:

  • Позвоните GetClassInfo()/GetClassInfoEx(), чтобы получить параметр по умолчанию WNDCLASS/WNDCLASSEX регистрационных данных для предварительного существующего класса, который вы пытаетесь завернуть, например как BUTTON.

  • Измените поле WNDCLASS::lpfnWndProc, чтобы указать на свой собственный обработчик сообщений окна, и смените поле WNDCLASS::lpszClassName на свое собственное имя класса. При необходимости измените любые поля WNDCLASS.

  • Позвоните по номеру RegisterClass()/RegisterClassEx() с изменениями WNDCLASS/EX.

Теперь вы можете позвонить CreateWindow/Ex() используя свое имя пользовательского класса, и все сообщения, в том числе создание WM_NCCREATE, будет проходить через обработчик окна сообщения.

Таким образом, инфраструктура VCL от Embarcadero подклассифицирует стандартные элементы управления Windows.

См. Также: How can I make a WNDPROC or DLGPROC a member of my C++ class?.