Сделай Сам Свою Работу на 5

Тема: Классы и стили окон





 

Основное поведение окна определяется классом окон. Класс окна (он не является классом языка программирования C++) несет информацию о начальном внешнем виде окна, пиктограмме по умолчанию, курсоре и ресурсе меню, связанном с окном; и – об адресе функции, называемой оконной процедурой.

Набор используемых ресурсов класса окна задают в структуре типа WNDCLASS.Эта структура описана следующим образом:

typedef struct

{ UINT style;

WNDPROC lpfnWndProc;

int cbClsExtra;

int cbWndExtra;

HANDLE hInstance;

HICON hlcon;

HCURSOR hCursor;

HBRUSH hbrBackground;

LPCTSTR lpszMenuName;

LPCTSTR lpszClassName;
} WNDCLASS;

 

Например, если описана структура для класса окна

WNDCLASS wc;

затем присваивают определенные значения ее полям.

 

Назначение полей этой структуры:

1. style определяет стиль класса окна и поведение окна, например:
wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;

2. lpfnWndProc указывает на функцию окна. Она будет рассмотрена позже.

3. cbClsExtra равно количеству дополнительных байтов класса.

4. cbWndExtraравно количеству дополнительных байтов окна этого класса.

5. hlnstance указывает на дескриптор текущего приложения.

6. hlconуказывает на имя пиктограммы (иконки), в которую превращается окно при минимизации.



7. hCursorзадает вид курсора мыши при его прохождении над окном.

8. hbrBackground задает дескриптор кисти закрашивания фона окна.
9. lpszMenuName указывает на имя ресурса главного меню окон этого класса. Если задать NULL, окна этого класса не имеют заданного по умолчанию меню. Например: we.lpszMenuName = (LPCTSTR)NULL;

10.lpszClassName указывает на текстовую строку, содержащую имя ре­гистрируемого класса окон, например:

wc.lpszClassName = szName;

 

Стиль класса окна

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

Чаще всего используются стиль CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS. Если для класса заданы стили CS_HREDRAW и CS_VREDRAW, то при изменении размеров окна функция окна может получить сообщение WM_PAINT. В этом случае функция окна должна перерисовать часть окна или все окно.

Стиль CS_DBLCLKSиспользуется при необходимости отслеживать двойные щелчки мышью. При этом в функцию окна посылаются сообщения WM_LBUTTONDBLCLK и WM_RBUTTONDBLCLK. Если этот стиль не будет задан, функция окна получит только идущие парами сообщения об одиночном нажатии клавиш мыши WM_LBUTTONDOWN и WM_RBUTTONDOWN.



Стили окон, окна основных стилей

Определенный в классе окна стиль класса окнаиспользуется при создании всех окон на базе этого класса. Для дальнейшего уточнения внешнего вида и поведения окна используется другая характеристика -стиль окна. Стиль окна указывается при создании окна функцией CreateWindow. Для определения стиля окна используются символические константы с префиксом WS_.

Рассмотрим чаще всего используемые основные стили:

- перекрывающиеся окна (overlapped window),

- всплывающие (или временные, или выпадающие) окна (pop-up window),

- дочерние окна (child window).

Перекрывающиеся окна

Перекрывающиеся окна имеют заголовок (title bar), рамку и внутреннюю часть окна (client region). Дополнительно перекрывающиеся окна могут иметь системное меню, кнопки для максимального увеличения размера окна и для свертки окна в пиктограмму, вертикальную и горизонтальную полосу просмотра и меню.

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

Для определения стиля перекрывающегося окна существует символическая константаWS_OVERLAPPEDWINDOW, определенная как поразрядное ИЛИ нескольких констант:

#define WS_OVERLAPPEDWINDOW (WS_OVERLAPPED|WS_CAPTION|

WS_SYSMENU|WS_THICKFRAME|

WS_MINIMIZEBOX|WS_MAXIMIZEBOX)

Приложение Windows может создавать несколько перекрывающихся окон, связанных между собой “узами родства” и “отношениями собственности”. При создании окон при помощи функции CreateWindow в качестве восьмого параметра функции можно указатьдескриптор окна-владельца(переменная типа HWND). Окно-владелец уже должно существовать на момент создания окна, имеющего владельца.



Основные особенности перекрывающихся окон:

· Если окно-хозяин сворачивается в пиктограмму, все окна, которыми оно владеет, становятся невидимыми.

· Если сначала свернули в пиктограмму окно, которым владеет другое окно, а затем и окно-хозяина, то пиктограмма подчиненного окна исчезнет.

· При уничтожении окна-владельца автоматически уничтожаются и все принадлежащие ему окна.

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

· Координаты создаваемых функцией CreateWindow перекрывающихся окон указываются по отношению ко всему экрану, т.е. при создании окна с координатами (0,0), оно будет расположено в верхнем левом углу экрана.

· При изменении размеров перекрывающегося окна функция окна получает сообщениеWM_SIZE, в параметрах которого указаны новые размеры окна.

Временные окна

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

Часто для создания выпадающих окон, имеющих рамку, используется стильWS_POPUPWINDOW, определенный как поразрядное ИЛИ нескольких констант (для того чтобы к временному окну добавить системное меню и заголовок, следует использовать комбинацию WS_POPUPWINDOW | WS_CAPTION):

#define WS_POPUPWINDOW (WS_POPUP|WS_BORDER|WS_SYSMENU)

Перечислим особенности временных окон.

· Временные окна могут иметь окно-владельца и могут сами владеть другими окнами. Замечания относительно владения перекрывающимися окнами, справедливы и для временных окон.

· Начало системы координат, используемой при создании временных окон, находится в левом верхнем углу экрана. Поэтому при создании временных окон применяются экранные координаты, как и при создании перекрывающихся окон.

· При изменении размеров временного окна функция окна получает сообщениеWM_SIZE, в параметрах которого указаны новые размеры окна.

Дочерние окна

Дочерние окна чаще всего используются приложениями Windows. Эти окна нужны для создания органов управления, таких, как кнопки или списки. Все органы управления - дочерние окна.

Стиль дочернего окна определяется константойWS_CHILDWINDOW. В отличие от перекрывающихся и временных окон дочерние окна, как правило, не имеют рамки, заголовка, кнопок минимизации и максимального увеличения размеров окна, а также полос просмотра. Дочерние окна сами рисуют все, что в них должно быть изображено.

Особенности дочерних окон следующие:

· Дочерние окна должны иметь окно-родителя. Только дочерние окна могут иметь родителей, перекрывающиеся и временные окна могут иметь окно-хозяина, но не родителя. У дочерних окон могут быть “братья” (или “сестры”).

· Дочерние окна всегда располагаются на поверхности окна-родителя.

· При создании дочернего окна начало системы координат расположено в левом верхнем углу внутренней поверхности окна-родителя (но не в верхнем углу экрана, как для перекрывающихся и временных окон).

· Так как дочернее окно как бы “прилипает” к поверхности окна-родителя, то при щелчке мышью над поверхностью дочернего окна, сообщение от мыши попадет в функцию дочернего, а не родительского окна.

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

· Если для приложения создается несколько дочерних окон, для каждого окна необходимо указать свой идентификатор, эти идентификаторы будут использоваться дочерними окнами при отправлении сообщений родительскому окну.

· Дочернее окно “прилипает” к поверхности родительского окна и перемещается вместе с ним. Оно никогда не может выйти за пределы родительского окна.

· Все дочерние окна скрываются при сворачивании окна-родителя в пиктограмму и появляются вновь при восстановлении родительского окна.

· При изменении размеров родительского окна дочерние окна получаютсообщение WM_PAINT, но не получают сообщения WM_SIZE, это сообщение попадает только в родительское окно.

Примеры создания окон различных стилей

Ниже приведе фрагмент функции WinMain, создающей окна разных стилей на основе двух классов окон:

// регистрация классов окон с именами "MainWindow”, "Window1", "Window2"

. . .

// создание главного перекрывающегося окна

HWND hWndMain = CreateWindow("MainWindow", "OVERLAPPEDWINDOW",

WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance,NULL);

if(hWndMain == 0) return FALSE;

ShowWindow(hWndMain, nCmdShow);

UpdateWindow(hWndMain);

 

// создание временного окна

HWND hWndPopup = CreateWindow("Window1","POPUPWINDOW",

WS_POPUPWINDOW|WS_CAPTION|WS_MINIMIZEBOX|

WS_MAXIMIZEBOX|WS_VISIBLE,100,100,300,300,

hWndMain,NULL,hInstance,NULL);

if(hWndPopup == 0) { DestroyWindow(hWndMain); return FALSE; }

ShowWindow(hWndPopup, nCmdShow);

UpdateWindow(hWndPopup);

 

// создание дочернего окна

HWND hWndChild = CreateWindow("Window2","CHILDWINDOW",

WS_CHILDWINDOW|WS_CAPTION|WS_MINIMIZEBOX|

WS_MAXIMIZEBOX, 150,150,250,250, hWndMain, NULL,

hInstance,NULL);

if(hWndChild== 0)

{ DestroyWindow(hWndMain);

DestroyWindow(hWndPopup);

return FALSE;

}

ShowWindow(hWndChild, nCmdShow);

UpdateWindow(hWndChild);

 

// цикл обработки очереди сообщений

. . .

 

 

 








Не нашли, что искали? Воспользуйтесь поиском по сайту:



©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.