|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Регистрация класса окна. WinMain() отвечает за регистрацию класса главного окна приложенияWinMain() отвечает за регистрацию класса главного окна приложения. Каждый класс окна задает набор стилей, шрифтов, строк заголовка, значков, размеров, положений и так далее. Класс окна служит образцом, по которому определяются эти атрибуты. Windows 95 и Windows NT требуют, чтобы каждый экземпляр (каждая копия приложения) сам регистрировал класс окна для себя. Для всех классов окна используется в основном одна и та же структура C/C++. Следующий текст взят из WINUSER.H — файла, включаемого в WINDOWS.Н. Этот заголовочный файл содержит объявление typedef, определяющее структуру типа WNDCLASSW (UNICODE-совместимую), от которой порождается структура WNDCLASS.
typedef struct tagWNDCLASSW { UINT style; WNDPROC lpfnWndProc; int cbClsExtra; int cbWndExtra; HANDLE hInstance; HICON hIcon; HCURSOR hCursor; HBRUSH hbrBackground; LPCWSTR lpszMenuName; LPCWSTR lpszClassName; } WNDCLASSW, *PWNDCLASSW, NEAR *NPWNDCLASSW, FAR *LPWNDCLASSW;
Windows 95 вводит расширенную структуру класса, называемую WNDCLASSEX, которая позволяет применять для приложений маленький значок. Структура WNDCLASSEX определяется таким образом:
typedef struct _WNDCLASSEX { UINT style; WNDPROC lpfnWndProc; int cbClsExtra; int cbWndExtra; HANDLE hInstance; HICON hIcon; HCURSOR hCursor; HBRUSH hbrBackground; LPCTSTR lpszMenuName; LPCTSTR lpszClassName; HICON hIconSm; } WNDCLASSEX;
Как видно, эти две структуры идентичны за исключением того, что WNDCLASSEX дополнительно содержит поле hIconSm, где находится описатель маленького значка, связанного с классом окна. Windows 95 и Windows NT дают несколько предопределенных классов окна, но большинство приложений определяют собственный класс окна. Для этого в программе объявляется структура соответствующего типа, в элементы которой заносится информация о классе окна. Следующий листинг, взятый из программы WIN32SWP, демонстрирует объявление и инициализацию структуры WNDCLASS.
char szProgName[]="ProgName";
…
WNDCLASS wcApp; if(!hPreInst) { wcApp.lpszClassName = szProgName; wcApp.hInstance = hInst; wcApp.lpfnWndProc = WndProc; wcApp.hCursor = LoadCursor(NULL,IDC_ARROW); wcApp.hIcon = NULL; wcApp.lpszMenuName = NULL; wcApp.hbrBackground = GetStockObject(WHITE_BRUSH); wcApp.style = CS_HREDRAW|CS_VREDRAW; wcApp.cbClsExtra = 0; wcApp.cbWndExtra = 0; if(!RegisterClass (&wcApp)) return FALSE; }
Шаблону WIN32SWP дается имя szProgName, которое также присваивается элементу wcApp. lpszClassName. Следующее поле структуры WNDCLASS, wcApp.hInstance, получает значение, которое было передано функции WinMain() параметром hInst, то есть описатель экземпляра приложения. Элементу lpfnWndProc присваивается адрес функции окна, в данном примере это WndProc. ПРИМЕЧАНИЕ. Имя WndProc определяется программистом — это не предопределенное имя. Прототип этой функции должен появляться раньше точки присваивания. В поле wcApp.hCursor заносится описатель курсора приложения, в данном примере это IDC_ARROW (представляющий системный курсор в виде наклонной стрелочки). Программа получает описатель путем обращения к функции LoadCursor() Поскольку у приложения WIN32SWP нет своего значка, элемент wcApp.hIcon получает значение NULL. Так как значение элемента wcApp.lpszMenuName равно NULL, Windows 95 и Windows NT понимают, что окна данного класса не имеют меню. Если окну необходимо было бы меню, то вместо NULL здесь стояло бы имя меню в кавычках. Функция GetStockObject() возвращает описатель кисти для заполнения фона рабочей области окон этого класса. В данном примере используется стандартная белая кисть Windows 95 или Windows NT, WHITE_BRUSH. Стиль класса, задаваемый элементом wcApp.style, получает значение CS_HREDRAW|CS_VREDRAW. Все константы, используемые для стиля класса, определены в WINUSER.H и имеют префикс "CS_". Каждый из них задает битовый флаг, который комбинируются операцией | (поразрядное ИЛИ). Параметры CS_HREDRAW и CS_VREDRAW указывают Windows, что при изменении горизонтального или вертикального размеров окна вся рабочая область должна быть перерисована. Последние два элемента, wcApp.cbClsExtra и wcApp.cbWndExtra, обычно равны нулю. Эти поля иногда используются для указания количества дополнительных байт, зарезервированных после самой структуры класса окна (wcApp.cbClsExtra) и после структуры параметров окна (wcApp.cbWndExtra). Под управлением Windows 95 и Windows NT программа проверяет значение hPreInst, которое всегда равно NULL, и затем регистрирует класс окна.
if (!hPreInst) {
… if (!RegisterClass(&wcApp)) return FALSE; }
В этом тексте два оператора if. Внешний if управляет инициализацией структуры WNDCLASS, если данный экземпляр программы — первый. Внутренний оператор if регистрирует класс окна, передавая дальний указатель на структуру класса в функцию RegisterClass(). Если Windows не может зарегистрировать класс окна (например, если недостаточно памяти), RegisterClass() вернет 0, и программа завершится.
Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.004 сек.) |