|
Программирование >> Процедурные приложения
typedef-определений от этих структур порождается универсальная Структура wndclass, позволяющая программисту не заботиться о формате используемых строк. Чтобы определить класс окна, приложение должно объявить переменную следующего типа: WNDCLASS wcApp; Впоследствии переменная wcApp заполняется информацией о классе окна. Ниже описываются различные поля структуры wndclass. style Определяет свойства окна. С помощью операции побитового ИЛИ можно задать комбинацию из нескольких свойств. Возможные свойства поля style перечислены в табл. 17.3.
IpfnWndProc Содержит указатель на оконную процедуру, которая будет обрабатывать все сообщения, посылаемые окну. cbClsExtra Содержит информацию о количестве байтов, выделяемых системой после создания структуры класса окна. Значение этого параметра может быть равным NULL. cbWndExtra Содержит информацию о количестве байтов, выделяемых системой после создания экземпляра окна. Этот параметр может быть равным NULL. hlnstance Содержит дескриптор экземпляра приложения, регистрирующего класс окна. hlcon Содержит дескриптор значка приложения. Этот параметр может быть равным NULL. hCursor Содержит дескриптор указателя мыши, используемого в окне приложения. Этот параметр может быть равным null. hbrBackground Определяет кисть, используемую для заливки фона окна. Может содержать дескриптор реальной кисти или одну из следующих констант (к задаваемой константе следует прибавить COLOR ACTIVEBORDER COLOR ACTIVECAPTION COLOR APPWORKSPACE COLOR BACKGROUND COLOR BTNSHADOW COLORJBTNTEXT COLOR CAPTIONTEXT CQLORJ3RAYTEXT COLOR HIGHLIGHT COLOR HI GHLIGHTTEXT CQLOR INACTIVEBORDER COLOR INACTIVECAPTION COLOR MENU COLOR MENUTEXT COLOR SCROLLBAR COLOR WINDOW COLOR WINDOWFRAME COLOR WINDOWTEXT Если значение параметра hbrBackground равно NULL, то приложение должно самостоятельно управлять заливкой фона окна при получении сообщения WM ERASEBKGND. lpszMemiName Содержит указатель на строку, завершающуюся нулевым символом и представляющую собой имя ресурса меню. Этот параметр может быть равным null. lpszClassName Содержит указатель на строку, завершающуюся нулевым символом и представляющую собой имя класса окна. Структура WNDCIASSEX Существует расширенный вариант структуры wndclass, получивший название wndclassex. От wndclassон отличается тем, что дополнительно позволяет использовать в приложении значок малого размера. typedef struct WNDCLASSEX { UINT cbSize UINT style; WNDPROC IpfnWndProc; int cbClsExtra; int cbWndExtra; HANDLEhlnstance; HICON hlcon; HCURSOR hCursor HBRUSHhbrBackground; LPCTSTR IpszMenuName; LPCTSTR IpszClassName; HICON hlconSm ) WNDCLASSEX; В поле cbSize задается размер всей структуры. Это обычно делается с помощью выражения sizeof(WNDCLASSEX). В поле hlconSm содержится дескриптор малого значка. Определение класса окна В приложении можно Описать собственный класс окна, создав для него структуру соответствующего типа и заполнив поля структуры атрибутами разрабатываемого приложения. Следующий фрагмент взят из файла SWP.C и демонстрирует, как можно создать и проинициализировать структуру wndclass: char szProgName[]= ProgName ; WNDCLASS wcApp; wcApp.lpszClassName = szProgName; wcApp.hlnstance = hlnst; wcApp.lpfnWndProc = WndProc; wcApp.hCursor = LoadCursor(NULL, IDC ARROW); wcApp.hlcon = NULL; wcApp.lpszMenuName = 0; wcApp.hbrBackground = GetStockObject(WHITE BRUSH); wcApp. style = CS HREDRAW CS VREDRAW; wcApp.cbClsExtra = 0; wcApp.cbWndExtra = 0; if (IRegisterClass(SwcApp)) return 0; Имя программы хранится в переменной szProgNameи записывается в класс окна в поле wcApp.IpszClassName. Второму полю структуры wndclass, называемому wcApp. hinstance, передается аргумент hlnstфункции winMain(), хранящий дескриптор текущего экземпляра приложения. Полю ipfnWndProc присваивается указатель на оконную процедуру, которая будет обрабатывать все сообщения, посылаемые окну. В файле SWP.C эта функция называется WndProc(). Имя WndProc() задано программистом, т.е. не является стандартным. Прототип функции должен быть описан до выполнения операции присваивания. В поле wcApp.hCursor хранится дескриптор указателя мыши текущего экземпляра приложения. В нашем примере создается указатель idc arrow(соответствует обычному указателю мыши в виде наклоненной стрелки), дескриптор которого возвращается функцией LoadCursor(). Поскольку в приложении нет устанавливаемого по умолчанию значка, полю wcApp.hlcon присваивается значение null. Если поле wcApp.lpszMenuName содержит NULL, то Windows считает, что у приложения нет собственного меню. В противном случае должно быть указано название ресурса меню, взятое в кавычки. Функция GetStockObject() возвращает дескриптор кисти, которая используется для заливки фона окна, созданного на базе данного класса. В нашем случае применяется стандартная белая кисть - WHITEBRUSH. В поле wcApp. style свойства окна задаются как cs HREDRAW в сочетании с cs vredraw. Константы с префиксом cs определены в файле WINUSER.H и могут объединяться с помощью операции побитового ИЛИ (). Константы cs hredraw и cs vredraw указывают Windows, что рабочую область окна нужно перерисовывать всякий раз, когда размер окна изменяется по вертикали или горизонтали. Последние два поля, wcApp.cbClsExtra и wcApp.cbWndExtra, обычно устанавливают равными 0. Их предназначение - указание дополнительного количества байтов памяти, которые должны быть зарезервированы после создания класса окна или экземпляра самого окна. Ранее мы уже говорили о том, что в 16-разрядных версиях Windows приложение регистрировало класс окна только в том случае, если не существовало ранее загруженных копий этой же программы. Зарегистрированный класс окна становился доступным для всех остальных программ, поэтому необходимость в повторной его регистрации не возникала. Вот как это делалось: if (IhPrelnst) { if (IRegisterClass(SwcApp)) return FALSE; }
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |