Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
созд_окна.doc
Скачиваний:
6
Добавлен:
13.08.2019
Размер:
148.48 Кб
Скачать

Обработка сообщения wp_paint

Это сообщение уведомляет программу, что часть или вся клиентская область окна недействительна и ее следует перерисовать. Что значит недействительна?

Область объявляется Windows недействительной в том случае, когда требуется перерисовка окна, например:

– при создании окна недействительна вся его клиентская область, т.к. в ней еще ничего не нарисовано;

– при изменении размеров окна;

– при минимизации окна, а затем при его разворачивании до начального размера;

– при перекрытии окон, а затем закрытая часть окна вновь открывается и т.п.

Во всех перечисленных случаях (кроме первого) ОС автоматически помечает клиентскую область окна как недействительную, что влечет за собой посылку сообщения WM_PAINT. В первом случае (при создании окна) аналогичный эффект достигается вызовом функции ShowWiondow. В процессе ее выполнения генерируются сообщения WM_SIZE и WM_MOVE. А обрабатывая сообщение WM_SIZE автоматически генерируется сообщение WM_PAINT.

Обработку сообщения WM_PAINT следует начинать с вызова функции

hDC = BeginPaint(hWnd, &ps), где:

hDC – контекст дисплея для клиентской области окна;

hWnd – дескриптор окна;

&ps – адрес структуры типа

PAINTSTRUCT typedef struct tagPAINTSTRUCT

{

HDC hdc; // контекст устройства

BOOL fErase; // признак стирания фона клиентской области

RECT rcPaint; // границы недействительного прямоугольника

BOOL fRestore;

BOOL fIncUpdate;

BYTE rgbReserved[32]

} PAINTSTRUCT;

Последние три поля используются ОС.

Обычно приложение рисует что-либо в окне, реагируя на сообщение WM_PAINT !!!

МЕНЮ

Различают два типа пунктов меню:

пункт-команда – конечный пункт меню;

пункт-подменю – заголовок меню следующего более низкого уровня.

Реакция Windows на выбор пункта меню зависит от типа пункта. Если выбрана пункт-команда, то Windows посылает приложению сообщение WM_COMMAND.

Меню можно создать одним из трех способов:

- на основе шаблона меню, определенного в файле описания ресурсов;

- при помощи функций CreatMenu и AppendMenu;

- на основе шаблона меню, определяемого в памяти во время выполнения программы при помощи функции LoadMenuIndirect.

Чаще всего используется первый способ.

Вызов редактора меню

Чтобы подключить меню к приложению, необходимо, прежде всего, в файл cpp, в котором регистрируется и создается главное окно приложения, включить заголовочный файл #include "resource.h".

В главном меню Visual Studio выполнить команду

Проект → Добавить ресурс → Menu → Создать.

По умолчанию редактор присваивает первому из создаваемых шаблонов меню имя IDR_MENU1. В файле resource.h этот идентификатор определяется как целочисленная константа. В начале полосы создаваемого меню будет отображен пунктирный прямоугольник нулевого пункта. Нумерация пунктов начинается с нуля.

Изначально окно атрибутов пункта настроено на определение пункта-подменю. Если нужно определить пункт как пункт-команда, то необходимо атрибут Всплывающее меню установить false.

Добавление меню к окну приложения

После определения меню в файле описания ресурсов оно еще не появится в составе окна приложения. Чтобы это случилось, меню нужно присоединить к окну.

Наиболее традиционным способом является присваивание полю lpszMenuName структуры WNDCLASSEX значения указателя на это меню, что надо сделать еще перед регистрацией класса окна. Если имя меню определено как целочисленный идентификатор (например, IDR_MENU1), то применяется макрос MAKEINTRESOURCE для получения значения указателя. Например:

lpszMenuName = MAKEINTRESOURCE(IDR_MENU1).

Вызов диалога

Обработкой сообщения WM_COMMAND, которые инициируются после выбора команд меню, занимается оконная процедура. В случае выбора пункта меню младшее слово wParam содержит идентификатор пункта меню. Пример:

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

switch (message)

{

case WM_CREATE:

***

break;

case WM_SIZE:

***

break;

case WM_PAINT:

***

break;

case WM_COMMAND:

switch(LOWORD(wParam))

{

case ID_FILE:

MessageBox(NULL,_T("Меню файл!"), _T("OK!"), NULL);

break;

}

break;

case WM_DESTROY:

***

break;

default:

return DefWindowProc(hWnd, message, wParam, lParam);

}

return 0;

}

ДИАЛОГОВЫЕ ОКНА

Типы диалоговых окон

Диалоговые окна бывают модальные (modal) и немодальные (modeless). Когда в программе вызывается модальное диалоговое окно, оно ожидает выполнения некоторого действия со стороны пользователя, прежде чем программа сможет продолжить свое выполнение. Пользователь не может переключиться между диалоговым окном и другими окнами программы. Он должен явно закрыть диалоговое окно, что обычно делается щелчком по кнопке OK или Canсel.

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

Создание и обработка диалогового окна

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

1. Определение шаблона диалогового окна;

2. Определение диалоговой процедуры;

3. Вызов функции создания диалогового окна;

4. Обмен данными между диалоговой процедурой и вызывающей функцией окна.

Вызов и использование редактора диалоговых окон

В главном меню Visual Studio выполнить команду

Проект → Добавить ресурс → Dialog → Создать.

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

Диалоговая процедура во многом напоминает оконную процедуру. Она должна иметь спецификатор CALLBACK, поскольку вызывается операционной системой. Имя процедуры может быть произвольным, однако сложилась традиция завершать это имя DlgProc. Функция принимает такой же набор параметров, что и обычная оконная процедура WndProc. Однако некоторые различия все же есть:

- оконная процедура возвращает значение типа LRESULT, а диалоговая процедура – значение типа BOOL;

- если оконная процедура не обрабатывает какое-то сообщение, то она вызывает DefWindowProc. Если же диалоговая процедура не обрабатывает какое-то сообщение, то она возвращает значение FALSE, если сообщение обрабатывается, то возвращается TRUE;

- диалоговая процедура не обрабатывает сообщение WM_CREATE. Вместо этого она выполняет инициализацию при обработке специального сообщения WM_INITDIALOG;

- диалоговая процедура не обрабатывает сообщение WM_PAINT, так как все функции диалогового окна реализуются элементами управления.

Сообщение WM_INITDIALOG является первым сообщением, которое получает диалоговая процедура. Если после обработки этого сообщения процедура возвращает значение TRUE, то Windows помещает фокус ввода на первое дочернее окно элемента управления, которое имеет стиль WS_TABSTOP. В то же время при обработке сообщения WM_INITDIALOG диалоговая процедура может использовать функцию SetFocus для того, чтобы установить фокус на какой-то другой элемент управления. Но тогда она должна вернуть значение FALSE.

Блок обработки сообщения WM_INITDIALOG является самым удобным местом для инициализации элементов управления, если в этом есть необходимость.

Основным сообщением, обрабатываемым в диалоговой процедуре, является WM_COMMAND. Напоминание: если источником сообщения WM_COMMAND является элемент управления, то младшее слово wParam – идентификатор элемента управления, а параметр lParam – дескриптор элемента управления.

При обработке элементов управления, отвечающих за выход из диалогового окна (OK, Cancel), диалоговая процедура вызывает функцию EndDialog, после чего возвращает значение TRUE. Для всех остальных сообщений процедура возвращает значение FALSE.