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

StackOverflow https://stackoverflow.com/questions/635847

  •  10-07-2019
  •  | 
  •  

Вопрос

Я понимаю, что 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, поэтому я, вероятно, пойму сравнение с этими инструментами.

Это было полезно?

Решение

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

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

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

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

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

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

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

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

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top