Концепция WNDCLASSEX, хорошие навыки программирования и WndProc для системных классов - PullRequest
2 голосов
/ 11 марта 2009

Я понимаю, что Windows API использует "классы", опираясь на структуры WNDCLASS / WNDCLASSEX .

Я успешно прошел через приложения Windows API Hello World и понимаю, что этот класс используется нашими собственными окнами, а также основными элементами управления Windows, такими как «EDIT», «BUTTON» и т. Д. Я также понимаю, что он как-то связан с WndProc (он позволяет мне определить для него функцию)

Хотя я могу найти документацию по этому классу, я не могу найти ничего, объясняющего концепцию .

Пока что единственное, что я нашел в этом, было это:

Класс окна НИЧЕГО не имеет с C ++ классы.

Что на самом деле не помогает (оно говорит мне, что это не , но не говорит мне, что это * ). На самом деле, это только смущает меня больше, так как я хотел бы связать WNDCLASSEX с классами C ++ и подумать, что «WNDCLASSEX» представляет элемент управления тип , Итак, мой первый вопрос Что это?

Во-вторых, я понимаю, что можно определить WndProc в классе. Тем не менее, окно также может получать сообщения от дочерних элементов управления (или окон, или как они называются в Windows API). Как это может быть?

Наконец, когда это хорошая практика программирования для определения нового класса ? Для каждого приложения (для основного кадра), для каждого кадра, по одному на каждый элемент управления, который я определяю (например, если я создаю свой собственный класс индикатора выполнения)?

Я знаю Java / Swing, C # / Windows.Form, C / GTK + и C ++ / wxWidgets, поэтому я, вероятно, пойму сравнение с этими инструментами.

Ответы [ 2 ]

6 голосов
/ 11 марта 2009

Класс окна описывает свойства, которые будут использоваться для всех экземпляров этого класса. Помимо цветов, значков и т. Д., Одним из этих свойств является процедура окна. Это функция обратного вызова, которая отвечает за обработку всех сообщений из системы и их обработку по мере необходимости.

Хотя это не связано с концепцией, она аналогична классам C ++ - один фрагмент кода определяет данные и функциональные возможности класса, и может быть много экземпляров этого класса.

В качестве очень грубого примера класс "BUTTON" WndProc переводит последовательность WM_LBUTTONDOWN/WM_LBUTTONUP как "щелчок". Во время этой последовательности WndProc также раскрасит кнопку в «нажатом» состоянии в ответ на сообщение WM_PAINT.

Если окну необходимо сообщить о действии родителю (например, щелчком мыши), оно отправляет сообщения в виде «уведомлений» или «команд». Эти сообщения создаются дочерним элементом управления вручную и содержат идентификатор и все соответствующие данные.

Преимущество всего этого, просто создав окно (используя CreateWindow) класса кнопок, я получаю все это поведение автоматически.

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

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

Например, если для пользовательского интерфейса моего приложения требуются изображения жирафов, которые вращаются, когда над ними находится мышь, я могу написать код для этого в WindowProcedure и зарегистрировать его как новый класс («SPINNYGIRAFFE»). Остальная часть моего приложения просто создает окна класса «SPINNYGIRAFFE», и все просто работает.

1 голос
/ 11 марта 2009

Как это может быть?

Дочерние элементы управления (это также окна) отправляют сообщение в родительское окно, Windows (обратите внимание на capitilization, это ОС) знает текущий WndProc этого окна и вызывает его.

Когда это хорошая практика программирования для определения нового класса?

Каждое окно должно иметь класс, поэтому, если для вашего окна не существует существующего класса, вы должны определить новый класс. Скорее всего, вам потребуется определить классы для всех ваших собственных окон верхнего уровня, но не для каких-либо элементов управления (встроенных в них для классов) или для диалогов, поскольку API-интерфейсы диалоговых окон в Windows используют другой класс buildin.

...