Смекни!
smekni.com

Windows (стр. 5 из 9)

вызывается неявно Windows при поступлении сообщений в окно, за

которым оно закреплено. Функция окна имеет вид:

long far PASCAL WndProc ( HWND hwnd,

WORD msg,

WORD wParam,

LONG lParam );

hwnd - логический номер окна, идентифицирующий окно, связанное с приложением;

msg - идентификатор приложения;

wParam и lParam определяют дополнительную информацию и зависят от типа сообщения.

Для облегчения работы программиста существует

специальная функция обработки сообщений DefWindowProc с теми

же параметрами, которая производит стандартную обработку всех

сообщений. Кроме того она играет ключевую роль в формировании

информационных потоков сообщений Windows, и ее указание в

функции окна обязательно.

Создание окна

Создание окна производится при помощи функции

CreateWindow. Она создает окно, имеющее указанный тип и принадлежащее к указанному классу. Прототип функции имеет вид:

HWND FAR PASCAL CreateWindow

(

LPSTR, // имя класса окна

LPSTR, // заголовок окна

DWORD, // тип окна

int, // X-координата

int, // Y-координата

int, // Ширина окна

int, // Высота окна

HWND, // Дескриптор копии-родителя

HMENU, // Дескриптор меню

HANDLE, // Дескриптор копии

LPSTR // Дополнительная информация

);

Тип окна является комбинацией битовых флагов,

определяющих стиль окна. Возможные значения типа окна рассмотрены ниже.

Дескриптор копии-родителя определяет порождающее окно. Он определяет, где существует окно и может ли окно быть автоматически показано/скрыто/уничтожено (для всех типов окон). Когда показывается, скрывается или уничтожается, все порожденные им окна разделяют его судьбу

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

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

инициализации окна.

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

В случае успешного создания окна функция CreateWindow возвращает индекс окна.

Отображение и обновление окна

Окно не отображается на экране сразу после создания; для отображения окна используется функция ShowWindow. Еепрототип:

BOOL FAR PASCAL ShowWindow( HWND wnd, int cmdShow );

wnd - дескриптор отображаемого окна;

cmdShow - определяет, как окно первоначально будет отображаться на экране:

SW_SHOWNORMAL - обычное окно;

SW_SHOWMINIMIZED - минимизированное в виде пиктограммы; SW_SHOWMAXIMIZED - максимизорованное на весь экран;

Для обновления окна используется функция UpdateWindow. Ее прототип выглядит так:

void FAR PASCAL UpdateWindow( HWND wnd );

Типы окна

Тип окна задается 32-битовым целым числом, которое представляет собой комбинацию битовых флагов, определяющих различные свойства окна.

WS_OVERLAPPED - перекрывающееся окно. Перекрывающиеся окна - это основной наиболее универсальный тип окон Windows. Главное окно приложения обычно имеет такой вид.

WS_POPUP - вспомогательные окна. Они используются чаще всего для отображения окон диалога. Вот некоторые свойства вспомогательных окон:

- если такое окно имеет родительское окно, то всегда отображаются поверх всех окон на экране, даже когда пользователь делает активным другое окно;

- вспомогательные окна не имеют заголовка и часто должны иметь фиксированный размер.

WS_CHILD - дочернее окно. Окна такого типа создаются, если у приложения есть главное (а значит и перекрывающее окно) и связаны некоторыми характеристиками с тем окном из которого были вызваны. Все органы управления также являются дочерними окнами. Вот некоторые их свойства:

- дочерние окна никогда не отображаются вне своего родительского окна ни в раскрытом виде, ни в виде пиктограммы;

- координаты дочерних окон отчитываются от верхнего левого угла рабочей области окна-родителя и при перемещении последнего, дочерние окна перемещаются вместе с ним;

- дочернее окно никогда не может стать активным окном.

WS_MINIMIZE - создаваемое окно будет отображено в виде пиктограммы.

WS_VISIBLE - Окно становится видимым сразу после создания. Используется для диалоговых окон.

WS_DISABLED - создается неактивное окно.

WS_CLIPSIBLINGS - исключение областей, занимаемых

другими дочерними окнами из изменяемой области дочернего окна.

Используется только для дочерних окон.

WS_CLIPCHILDREN - исключение областей, занимаемых

другими дочерними окнами при изменении рабочей области

родительского окна. Используется только для родительских окон.

WS_MAXIMIZE - создаваемое окно будет отображено в максимально возможном виде.

WS_CAPTION - окно имеет рамку и заголовок, а следовательно пользователь может перемещать его при помощи мыши.

WS_BORDER - окно имеет широкую рамку без заголовка. Используется при создании диалоговых окон.

WS_DLGFRAME - окно имеет тонкую рамку без заголовка.

WS_VSCROLL - окно имеет вертикальную полосу просмотра.

WS_HSCROLL - окно имеет горизонтальную полосу просмотра.

WS_SYSMENU - окно имеет системное меню.

WS_THICKFRAME - создаваемое окно имеет рамку существенно заметной толщины.

WS_MINIMIZEBOX - окно имеет кнопку минимизации.

WS_MAXIMIZEBOX - окно имеет кнопку максимизации.

Построение меню

Для создания меню нужно проделать:

1. Задать структуру меню в файле ресурсов,

последовательно определив пункты меню в виде текстовых строк.

2. Каждому пункту меню поставить в соответствие

уникальный идентификатор.

3. Указать имя меню в структуре класса окна.

Определение меню

Определение меню в файле ресурсов должно иметь вид:

MenuName MENU [опции загрузки][опции памяти]

BEGIN

MENUITEM "Item1" IDM_Item1 [, опции]

MENUITEM "Item2" IDM_Item3 [, опции]

...

POPUP "Item3" [, опции]

BEGIN

MENUITEM "Item3-1" IDM_Item3-1 [, опции] MENUITEM "Item3-2" IDM_Item3-2 [, опции] ...

END

END

MenuName - имя ресурса меню для обращения из подпрограммы.

Опции загрузки определяет как следует поступить с ресурсом при загрузке приложения на выполнение - сразу загрузить или при неоходимости.

Опции памяти определяют, как Windows должна обращаться с сегментом памяти, куда загружается ресурс.

Пункты меню определяются между словами BEGIN и END. Они могут быть двух видов: MENUITEM и POPUP. Пункт типа MENUITEM является конечным пунктом меню. При выборе этого пункта функции окна сообщения передается сообщение WM_COMMAND с идентификатором пункта меню в качестве параметра. Пункт типа POPUP является заголовком подменю.

Опции пункта меню могут комбинироваться. В качестве опций пункта меню могут быть следующие значения:

GRAYED - пункт меню не активен. Текст пункта меню отображается в сером цвете.

INACTIVE - пункт меню не активен. Текст пункта меню отображается также как и в других пунктах.

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

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

CHECKED - пункт меню помечен галочкой, помещенной слева от него. Не действует для пунктов главного меню.

SEPARATOR - определяет разделитель, который выделяет в группы связанные списки меню.

HELP - пункт меню выравнивается по правой стороне меню.

Обьекты диалога

Обьекты диалога, в состав которых входят кнопки, комбинированные блоки, элементы управления редактированием, блоки списков, полосы прокрутки, статические элементы, являются с точки зрения Windows обычными дочерними окнами.

Взаимодействие между родительским окном (окном диалога) и обьектами диалога осуществляется посредством сообщений. Когда пользователь производит какое-либо действие с обьектом диалога, функции окна родителя передается сообщение WM_COMMAND, в качестве параметра wParam которого передается индекс обьекта диалога, а в качестве параметра lParam - специальная дополнительная информация.

Для того, чтобы сконструировать обьект диалога нужно:

1. Зарегистрировать класс окна диалога.

2. Создать дочернее окно функцией CreateWindow, указав зарегистрированный класс окна.

3. В функции окна обьекта диалога определить дескриптор дочернего окна при помощи функции GetParent.

4. По тому или иному действию пользователя уведомлять родительское окно соответствующими сообщениями при помощи функции SendMessage.

Для обьектов диалога как дочерних окон не требуется регистрировать класс окна - в Windows определены стандартные классы окон - обьектов диалога: "button", "edit", "scrollbar", "listbox" и пр.

При использовании стандартных классов Windows для создания обьекта диалога нужно вызвать только функцию CreateWindow.

Рассмотрим основные обьекты диалога.

Кнопки и переключатели

Кнопка "Button" обычно используется для осуществления каких - либо немедленных действий, без переключения или включения/выключения каких-либо опций.

Переключатель "И" ("CheckBox") используется как

переключатель опций вкл/выкл. Будучи соединенными в группу

переключатели реализуют логику "И".

Переключатель "ИЛИ" ("RadioButton") используется как переключатель опций вкл/выкл. Будучи соединенными в группу переключатели реализуют логику "ИЛИ".

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

и переключателей.

BS_PUSHBUTTON - определяет кнопку с жирной рамкой.

BS_DEFPUSHBUTTON - определяет кнопку с жирной рамкой. Обычно используется для определения действия по умолчанию.

BS_CHECKBOX - определяет квадратик, имеющий два

состояния: отмеченное (перечеркнут крестиком) и не отмеченное

(квадратик пуст). В момент отметки рамка квадрата выделяется

жирной линией.

BS_AUTOCHECKBOX - тоже, что предыдущий, только состояние кнопки при отметке отслеживается автоматически.