Регистрация оконного класса и создание окна 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Регистрация оконного класса и создание окна



4.1 Функция RegisterClassи структура WNDCLASS

Оконный класс задает общее поведение окон нового типа, главное, он содержит адрес оконной процедуры. Для регистрации нового оконного класса предназначена функция:

ATOM RegisterClass(CONST WNDCLASS* lpwc);

Единственный параметр этой функции, lpwc, является указателем на структуру типа WNDCLASS, описывающую новый тип окна. Возвращаемое значение имеет тип Windows atom, это 16-разрядное число, являющееся идентификатором уникальной символьной строки в служебной внутренней таблице Windows. Структура WNDCLASS имеет следующее описание:

 

typedef struct _WNDCLASS {

UINT style;

WNDPROC lpfnWndProc;

int cbClsExtra;

int cbWndExtra;

HANDLE hInstance;

HICON hIcon;

HCURSOR hCursor;

HBRUSH hbrBackground;

LPCTSTR lpszMenuName;

LPCTSTR lpszClassName;

} WNDCLASS;

 

Смысл некоторых переменных очевиден. Например, hIcon является дескриптором пиктограммы, используемой для отображения окон данного класса в свернутом виде. hCursor – это дескриптор стандартного указателя мыши, который устанавливается при перемещении указателя над областью окна; hbrBackground – дескриптор кисти (это объект модуля GDI), применяемой для рисования фона окна. Cтрока lpszMenuName является идентификатором ресурса меню (символьное имя меню или целочисленный идентификатор, присваиваемый с помощью макроса MAKEINTRESOURCE), которое будет стандартным верхним меню для окон данного класса. Строка lpszClassName является именем оконного класса.

Переменные cbClsExtra и cbWndExtra можно использовать для выделения под оконный класс или для каждого экземпляра окна некоторой дополнительной памяти. Приложения могут пользоваться ею для хранения некоторой собственной информации, имеющей отношение к оконному классу или конкретным окнам.

Особенно важны первые две переменные структуры WNDCLASS. Большая часть свойств, делающих окно уникальным и сложным объектом, управляется именно этими переменными. В них хранится стиль (style) оконного класса и адрес оконной процедуры (lpfnWndProc).

Оконная процедура – это функция, ответственна за обработку всех сообщений, получаемых окном. Она может обрабатывать эти сообщения самостоятельно, или передавать их оконной процедуре "по умолчанию", DefWindowProc. Сообщения несут самую разнообразную информацию: об изменении размеров и местоположения окна, о событиях мыши, клавиатуры, командах пользователя, требования перерисовки, события таймера и других аппаратных устройств и т.п.

Существует аналог DefWindowProc, применяемый для диалоговых окон – функция DefDlgProc. Эта оконная процедура "по умолчанию" разработана специально для диалоговых окон. Она обеспечивает обслуживание элементов управления, например, переключение фокуса ввода.

С помощью стиля оконного класса, переменной style, задаются некоторые глобальные свойства оконного класса. Значение стиля является комбинацией значений битовых флагов (эта комбинация получается с помощью побитовой операции ИЛИ, т.е. оператора |). Например, флаг CS_DBLCLKS указывает Windows, что для окон данного класса надо генерировать сообщения о двойном щелчке мышью. Пара флагов CS_HREDRAW и CS_VREDRAW означают, что окно должно полностью перерисовываться после любого изменения горизонтального или вертикального размера.

 

Создание окна с помощью функции CreateWindow

Регистрация нового оконного класса – это только первый шаг в создании окна. Затем приложения обычно создают окна с помощью функции CreateWindow. Параметры этой функции задают более частные свойства экземпляра нового окна, например, его размеры, местоположение и внешний вид.

HWND CreateWindow(LPCTSTR lpClassName, LPCTSTR lpWindowName,

DWORD dwStyle, int x, int y, int nWidth, int nHeight,

HWND hWndParent, HMENU hMenu, HANDLE hInstance,

LPVOID lpParam);

Параметр lpClassName – это имя класса, чье поведение и свойства унаследует новое окно. Это может быть класс, зарегистрированный функцией RegisterClass, или один из стандартных оконных классов (например, классы элементов управления: BUTTON, COMBOBOX, EDIT, SCROLLBAR, STATIC).

Параметр dwStyle задает стиль окна. Его не следует путать со стилем оконного класса, который при регистрации оконного класса передается функции RegisterClass внутри структуры WNDCLASS. Стиль класса задает некоторые постоянные свойства окон данного класса, общие для всех окон. Стиль окна, передаваемый в CreateWindow, используется для инициализации более кратковременных свойств конкретного окна. Например, dwStyle можно применять для задания начального вида окна (свернутое, развернутое, видимое или скрытое). Как и для стиля класса, стиль окна обычно является комбинацией битовых флагов (которая строится с помощью оператора |). Кроме общих флагов, имеющих смысл для окон всех классов, некоторые флаги имеют смысл только для стандартных оконных классов. Например, стиль BS_PUSHBUTTON используется для окон класса BUTTON, которые должны выглядеть как нажимаемые кнопки и посылать по щелчку мыши своим родительским окнам сообщения WM_COMMAND.

Стили WS_POPUP и WS_OVERLAPPED задаются окнам верхнего уровня. Основное различие в том, что у окон WS_OVERLAPPED всегда есть заголовок, а у окон WS_POPUP он не обязателен. Перекрывающиеся окна обычно используются в качестве главных окон приложений, а всплывающие окна – как диалоговые окна.

При создании окна верхнего уровня вызывающее приложение задает его родительское окно с помощью параметра hwndParent. Родительским окном для окна верхнего уровня служит окно рабочего стола.

Дочерние окна создаются с использованием стиля WS_CHILD. Основное различие между дочерним окном и окном верхнего уровня в том, что дочернее окно заключено внутри клиентской области своего родительского окна.

В Windows определены некоторые комбинации стилей, удобные для создания "типичных" окон. Стиль WS_OVERLAPPEDWINDOW является комбинацией флагов WS_OVERLAPPED, WS_CAPTION, WS_SYSMENU, WS_THICKFRAME, WS_MINIMIZEBOX и WS_MAXIMIZEBOX. Такая комбинация применяется при создании типичного главного окна приложения. Стиль WS_POPUPWINDOW является комбинацией флагов WS_POPUP, WS_BORDER и WS_SYSMENU. Этот стиль применяется для создания диалоговых окон.

 

Рисование содержимого окна

Рисование в окне выполняется с помощью функций модуля GDI. Приложение обычно получает дескриптор контекста устройства, связанного с клиентской областью окна, (например, с помощью функции GetDC) и затем вызывает функции GDI вроде LineTo, Rectangle или TextOut.

5.1 Сообщение WM_PAINT

Сообщение WM_PAINT посылается окну, когда его части нуждаются в перерисовке и при этом в очереди сообщений потока-владельца окна больше нет никаких сообщений. Приложения выполняют обработку WM_PAINT с помощью функций рисования, вызываемых между вызовами функций BeginPaint и EndPaint. Функция BeginPaint возвращает набор параметров в виде структуры PAINTSTRUCT:

 

typedef struct tagPAINTSTRUCT {

HDC hdc;

BOOL fErase;

RECT rcPaint;

BOOL fRestore;

BOOL fIncUpdate;

BYTE rgbReserved[32];

} PAINTSTRUCT;

 

BeginPaint при необходимости выполняет очистку фона окна. Для этого приложению посылается синхронное сообщение WM_ERASEBKGND. Функция BeginPaint должна вызываться только для обработки сообщения WM_PAINT. Каждому вызову BeginPaint должен соответствовать последующий вызов EndPaint.

Приложения могут использовать переменную этой структуры hDC для рисования в клиентской области окна. Переменная rcPaint хранит координаты наименьшего прямоугольника, описывающего область, нуждающуюся в перерисовке. Ограничивая отрисовку этой областью, приложения могут ускорить процесс отображения.

5.2 Перерисовка окна по требованию

Функции InvalidateRect и InvalidateRgn позволяют приложению объявить все окно или его части "недействительными". В ответ Windows пошлет приложению сообщение WM_PAINT с требованием перерисовать эти области.

Данные функции обеспечивают приложениям эффективный способ полного или частичного обновления содержимого окон. Вместо немедленной перерисовки окна, приложение может объявить область окна недействительной. При обработке сообщения WM_PAINT приложение может учесть координаты обновляемого участка (переменную rcPaint в структуре PAINTSTRUCT) и перерисовать элементы только внутри этой области.

 



Поделиться:


Последнее изменение этой страницы: 2016-08-01; просмотров: 413; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.224.214.215 (0.007 с.)