Я хотел бы спросить, почему при разработке графических интерфейсов Windows с использованием API необходимо регистрировать класс окна? Какова концепция этого?
Я уже прочитал первые 3 главы Программирование Windows Чарльз Петцольд, но мне все еще интересно, какова цель явной регистрации класса. Почему я хочу сделать это явно? Почему это не делается в фоновом режиме, например, в функции CreateWindow () (или CreateWindowEx ())? Я имею в виду, почему код, который RegisterClass () выполняет внутри CreateWindow (), или почему CreateWindow () не вызывает сам RegisterClass ()?
Я также читал документацию по MSDN и знаю, что функция RegisterClass () связывает оконную процедуру с классом окна, заполняя структуру WNDCLASS. Я знаю, что это функция, которая обрабатывает сообщения от ОС, однако зачем регистрировать эту функцию (функцию WinProc) в классе внутри отдельной функции от CreateWindow ()?
Я могу понять причины существования функции CreateWindow () и почему она не показывает автоматически созданное окно. Это подразумевает, что я также понимаю назначение функции ShowWindow ().
Я уверен, что должны быть веские причины для такого поведения, чтобы программист мог зарегистрировать класс, когда он этого хочет, я просто не вижу этих причин, и поэтому я прошу вас, ребята, пролить свет на эту тему.
Пожалуйста, имейте в виду, что я очень новичок в разработке GUI с Windows API. Я сделал несколько графических интерфейсов в MATLAB, которые отличались от Windows API, и все же позволили мне понять некоторые принципы Windows, в частности назначение функций обратного вызова. Я не знаю, полезна ли эта информация, но если вам нужно провести аналогии, пожалуйста, будьте моим гостем.
Поскольку вы пометили свой вопрос на C ++, я приведу аналогию с C ++ …
RegisterClass
в основном вы определяете класс и включаете его в свою программу (очень похоже на #include
в C ++). WNDPROC
Ваш обработчик для всего, что происходит в окне, если и когда создается экземпляр.
CreateWindow
концептуально так же, как вы делаете new
в C ++. Вы просите Windows создать новое окно, и вы должны указать тип окна. Windows включает в себя набор предопределенных окон, таких как Button или Edit, но если вы хотите создать экземпляр своего собственного окна, то это нормально, вам просто нужно указать ему «класс», который вы хотите создать. Вы уже зарегистрировали этот класс по телефону RegisterClass
Таким образом, Windows теперь может перейти непосредственно к определению и создать экземпляр вашего окна.
Еще один способ думать, потому что Windows является закрытым исходным кодом, поэтому разработчики API не хотят, чтобы вы много знали внутри API. Так что теперь они думают: «Что если пользователь захочет создать свой собственный класс окна со своим поведением?». Вот почему WNDCLASS создан для того, чтобы пользователи могли объявлять информацию нужного им класса, присваивая такие значения, как имена, процедуры в поле члена. Это что-то вроде заполнения формы. Таким образом, вы можете видеть, что разработчики API достигают 2 вещей:
(1) пользователи ничего не знают об API, так как они явно не расширяют классы API до пользовательских, потому что если они это делают, то разработчики API должны предоставлять заголовки классов, и пользователи могут испортить это, делая Windows больше не закрыт.
(2) пользователи по-прежнему могут определять свои собственные классы окон.
Теперь, после того как вы определили свой собственный класс окна и хотите использовать его, вам нужно зарегистрировать этот класс, чтобы ОС Windows знала, что это за класс, чтобы они могли хранить информацию о нем для дальнейшей необходимости, а затем вы можете создать экземпляр этого.
Вам необходимо зарегистрировать RegisterClass, чтобы определить стиль, процедуру окна, которая необходима для программирования потока, которому принадлежит окно, для ответа на сообщения и события и выполнения чего-либо или ничего для каждого сообщения, которое получает окно, и для каждого происходящего события, значок вашего окна, курсор, который видит пользователь при наведении на него окна, фона клиента окна и меню окон.
Как вы можете представить окно без всех этих свойств?
Может быть, вы спросите, почему все эти свойства окна не являются параметрами функции CreateWindow, поэтому я установил их с помощью функции CreateWindow, а не функции RegisterClass, верно?
Если все свойства окна являются параметрами функции CreateWindow, то функция CreateWindow очень сложно и строка, которая вызывает CreateWindow правильно, очень длинный.
Это делает код очень большим, менее читаемым и менее продуктивным.
RegisterClass значительно упрощает CreateWindow.
Это одна из причин, по которой Microsoft хочет, чтобы разработчики Win32 сначала вызывали RegisterClass перед CreateWindow.
Также предположим, что вы хотите по крайней мере два окна с так же свойства.
Вы выделяете только один экземпляр структуры WNDCLASS, установите его поля, чтобы установить общий свойства ваших окон, и вы вызываете только функцию RegisterClass один раз, но вы вызываете CreateWindow столько раз, сколько необходимо для создания всех окон, которые вы хотите, но все с одинаковым именем класса.
RegisterClass не только значительно упрощает и сокращает код, но также предотвращает дублирование одного и того же кода. большой код в CreateWindow.
RegisterClass также делает код более продуктивным.
Это отличный дизайн, чтобы сначала выделить экземпляр WNDCLASS, установить его поля, вызвать функцию RegisterClass, а затем вызвать функцию CreateWindow столько раз, сколько вы хотите.
Хотя вам нужно вызывать RegisterClass несколько раз, если вы хотите, чтобы окна с разные свойства конечно.
Вам также придется изменять экземпляр WNDCLASS перед каждым вызовом функции RegisterClass.