Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

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




Стили классов окон и оконные стили, Различные метрики Windows, Управление окнами Windows

Рассмотрим различные типы окон, которые может создать приложение Windows.

На базе одного класса окна приложение может создать несколько окон. Все эти окна могут быть сделаны в одном или нескольких стилях.

· Стиль окна определяет внешний вид окна и его поведение.

· Для класса окна также определяется понятие стиля - стиль класса определяет внешний вид и поведение всех окон, созданных на базе данного класса.

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

Стиль класса окна определяется при регистрации класса окна. Стиль класса окна задается в виде отдельных битов, для которых определены символические константы с префиксом 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);

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

...

Окна с полосами прокрутки

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

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

Следует заметить, что

· Рабочая область окна не включает в себя пространство, занятое полосами прокрутки. Ширина вертикальной полосы и высота горизонтальной полос прокрутки постоянны для конкретного дисплейного драйвера (эти значения можно получить с помощью функции GetSystemMetrics).

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

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...