- •Часть II. Проектирование пользовательских интерфейсов средствами win32 api п 1. Основы приложений для Windows. П 1.1 Типы данных Windows.
- •П. 1.2 Главная функция приложения WinMain().
- •П. 1.3 Оконная функция.
- •П. 1.4 Сообщения от окна
- •П. 1.5 Сообщения от мыши
- •1.5.1 Сообщения мыши, связанные с рабочей областью окна
- •1.5.3 Двойные щелчки мыши
- •1.5.4 Сообщения мыши, связанные с нерабочей областью окна
- •1.5.5 Захват мыши
- •П. 1.6 Сообщения от клавиатуры
- •1.6.1 Синхронизация событий клавиатуры
- •1.6.2 Игнорирование событий клавиатуры
- •1.6.3 Понятие фокуса ввода
- •1.6.4 Категории клавиатурных сообщений
- •1.6.5 Аппаратные сообщения
- •1.6.6 Символьные сообщения
- •П. 1.7 Таймеры Windows и служба времени.
- •П. 1.8 Классы окон
- •1.8.1. Описание используемых классом окон ресурсов
- •1.8.2. Регистрация класса окон
- •1.8.3. Создание окон
- •1.8.4. Стили окна
- •П. 1.9 Цикл обработки сообщений
- •П. 1.10 Структура текста приложения
- •П. 1.11 Вспомогательные функции создания окон
- •1.11.1 Функции отображения и перерисовки окон
- •1.11.2 Функции поиска и определения состояния окон
- •1.11.3 Функции перемещения окон
- •1.11.4 Сообщения приложения для пользователя
- •П. 1.12 Примеры создания окон
- •П 2. Органы управления
- •П 2.1. Кнопки
- •2.1.1. Создание кнопок
- •2.1.2. Кнопки и сообщения
- •2.1.3. Флажки и переключатели
- •П 2.2. Статический орган управления
- •П 2.3. Полоса прокрутки
- •2.3.1. Общие сведения
- •2.3.2. Создание полосы прокрутки
- •2.3.3. Простейшие полосы прокрутки
- •2.3.4. Сообщения от полосы прокрутки
- •2.3.5. Управление полосой прокрутки
- •П 2.4 Редактор текста
- •2.4.1. Создание редактора
- •2.4.2. Сообщения для редактора текста
- •2.4.3. Сообщения от редактора текста
- •П 2.5. Списки строк
- •2.5.1. Создание списка
- •2.5.2. Сообщения от списка
- •2.5.3. Сообщения для списка
- •П. 2.6. Комбинированный список
- •2.6.1. Создание комбинированного списка
- •2.6.2. Коды извещения
- •2.6.3. Сообщения для комбинированного списка
- •П 3. Вывод в окно
- •П. 3.1. Виды контекста отображения
- •П 3.2. Сообщение wm_paint
- •П 3.3. Установка атрибутов контекста отображения для текста
- •П 3.4. Вывод текста
- •3.4.1. Настройка параметров шрифта
- •3.4.2. Выбор шрифта в контекст отображения
- •3.4.3. Функции вывода текста
- •3.4.4. Определение метрик шрифта
- •П 3.5. Рисование геометрических фигур
- •3.5.1 Установка атрибутов контекста отображения для рисования.
- •3.5.1. Функции рисования точки
- •3.5.2. Функции рисования линий
- •3.5.3. Функции рисования замкнутых фигур
- •3.5.4 Функции создания и рисования регионов
- •П. 4 Ресурсы приложения и их использование. П. 4.1 Файл ресурсов.
- •П 4.2 Главное меню
- •П. 4.2.1 Элементы меню
- •П. 4.2.2 Создание меню
- •П. 4.2.3 Сообщения от меню
- •П. 4.3. Плавающее меню
- •П. 4.4. Акселераторы
- •П. 4.5. Панель инструментов
- •4.5.1. Создание панели инструментов
- •4.5.2. Управление состоянием кнопок панели
- •4.5.3. Вывод подсказок в панели инструментов
- •П. 4.6. Строка состояния
- •4.6.1. Создание строки состояния
- •4.6.2. Сообщения о меню в строке состояний
- •П 5. Диалоговые панели п. 5.1. Характеристики диалоговых панелей
- •5.1.1. Единицы диалоговой панели '
- •5.1.2. Стили диалоговой панели
- •5.1.3. Функция окна диалоговой панели
- •П. 5.2. Создание диалоговой панели
- •5.2.1 Создание окна модальной диалоговой панели
- •5.2.2 Создание окна немодальной диалоговой панели
- •П. 5.3 Разработка и компоновка диалоговых панелей.
- •П. 5.4 Сообщения и диалоговые панели
- •П. 5.5. Стандартные диалоговые панели
- •5.5.1. Панели для открытия или сохранения файлов
- •5.5.2. Панель для выбора цветов
- •5.5.3. Панель для выбора шрифта
1.11.4 Сообщения приложения для пользователя
Для вывода текстовых сообщений и получения ответа пользователя применяют окно сообщения. Функция MessageBox создает, отображает, обеспечивает работу и закрывает окно сообщения:
int WINAPI MessageBox (
HWND hwnd, //Дескриптор родительского окна
LPCTSTR IpText, //Адрес текста сообщения
LPCTSTR IpCaption, //Адрес заголовка окна сообщения
UINT uType //Стиль окна сообщения
);
Если hwnd=NULL, окно сообщения не имеет родительского окна. При lpCaption= NULL в заголовке по умолчанию выводится строка "Ошибка". Параметр uType задают в виде комбинации флажков, определяющих содержание и поведение окна сообщения.
Следующие флаги определяют список кнопок окна сообщения:
Флаг |
Список имен кнопок |
MB_ABORTRETRYIGNORE |
"Стоп", "Повтор" и "Пропустить" |
MB_OK |
ОК |
MB_OKCANCEL |
ОК и "Отмена" |
MB_RETRYCANCEL |
"Повтор" и "Отмена" |
MB_YESNO |
"Да" и "Нет" |
MB_YESNOCANCEL |
"Да", "Нет" и "Отмена" |
Жирным шрифтом выделены кнопки по умолчанию. По умолчанию активна первая кнопка. Следующие флаги могут назначить одну из кнопок активной по умолчанию:
Флаг |
Номер кнопки |
Флаг |
Номер кнопки |
MB_DEFBUTTON1 |
Первая |
MB_DEFBUTTON3 |
Третья |
MB_DEFBUTTON2 |
Вторая |
MB_DEFBUTTON4 |
Четвертая |
Следующие флаги включают одну иконку в окно сообщения:
Флаги |
Вид иконки |
MB_ICONEXCLAMATION, MB_ICONWARNING |
Восклицательный знак |
MB_ICONINFORMATION, MB_ICONASTERISK |
Символ i |
MB_ICONQUESTION |
Знак вопроса |
MB_ICONSTOP, MB_ICONERROR, MB_ICONHAND |
Знак остановки |
Следующие флаги определяют стиль окна сообщения:
Флаг |
Пояснение |
MB_APPLMODAL |
Этот стиль по умолчанию. Окно hwnd пе реводится в неактивное состояние на вре мя работы окна сообщения, но можно ак тивизировать другие приложения или ок на, не дочерние по отношению к hwnd |
MB_SYSTEMMODAL |
На время работы окна сообщения все дру |
|
гие приложения в неактивном состоянии |
MB_TASKMODAL |
Этот стиль подобен MB APPLMODAL. |
|
Но если родительское окно не указано(hwnd= NULL), блокируются все перекрывающиеся окна этого приложения |
MB_HELP |
Добавляет кнопку "Справка" в окне сообщения |
MB_RIGHT |
Текст выравнивается по правому краю |
MB_RTLREADING
|
Отображает символы сообщения и текста заголовка в направлении справа налево |
MB_SETFOREGROUND |
Окно сообщения выдвигается на передний план |
Приложение может обработать ответ пользователя на сообщение, анализируя возвращаемое функцией MessageBox значение. В случае ошибки возвращается 0. Иначе функция MessageBox возвращает константу, соответствующую нажатой кнопке. Ниже перечислены имена констант, соответствующие кнопкам окна сообщения:
Константа Нажата кнопка Константа Нажата кнопка
IDABORT "Стоп" IDOК ОК
IDCANCEL "Отмена" IDRETRY "Повтор"
IDIGNORE "Пропустить" IDYES "Да"
IDNO "Нет"
Если окно сообщения содержит кнопку "Отмена", то значение IDCANCEL может быть возвращено и при нажатии клавиши Esc.
Windows предусматривает возможность выдачи и звуковых "сообщений". Например, при вызове функции MessageBeep компьютер проигрывает "звук" из множества зарегистрированных в системе "звуков". Синтаксис этой функции:
BOOL MessageBeep( UINT uType);
Параметр uType этой функции определяет звуковой тип и принимает одно из следующих значений:
Значение Обозначение в файле win.ini
OxFFFFFFFF или -1 Стандартный звуковой сигнал
MB ICONASTERISK SystemAsterisk
MB ICONEXCLAMATION SystemExclamation
MB ICONHAND SystemHand
MBJCONQUESTION SystemQuestion
MB OK или О SystemDefault
В случае успешного выполнения функция возвращает ненулевое значение, иначе - 0. После передачи сообщения о формировании звука, функция MessageBeep прекращает работу. Далее выполняются последующие операторы приложения, и одновременно проигрывается указанный звук.
Если требуется обратить внимание пользователя на определенное окно, то можно несколько раз изменить подсветку окна или его пиктограммы.
Для этой цели используют функцию FlashWindow, которая за один вызов один раз изменяет подсветку указанного окна:
BOOL FlashWindow(
HWND hwnd, //Дескриптор подсвечиваемого окна
BOOL bInvert //Параметр подсветки
);
Если параметр bInvert=TRUE, окно меняет подсветку. Если же bInvert=FALSE, окно только возвращается к исходному состоянию.
При подсветке неактивное окно может принять внешний вид активного окна, но не получит фокуса ввода.
Если окно было активно до вызова FlashWindow, возвращается ненулевое значение. Если окно не было активно, возвращается 0.
Пример. После нажатия левой клавиши мыши над окном hwnd 5 раз изменить подсветку неактивного окна OwnedHwnd.
Следующий фрагмент описывает версию решения этой задачи:
Case WM_LBUTTONDOWN:
{ FlashWindow(OwnedHwnd, TRUE);
for (int i=0; i<9; i++)
{ for (long j=0;j<1e7;j++);
FlashWindow(OwnedHwnd, TRUE);
}
return 0;
}
После нажатия левой клавиши мыши окно OwnedHwnd примет вид активного окна:
FlashWindow(OwnedHwnd, TRUE);
При i=0 выполняется некая "работа", обозначенная циклом for (long J=0;j<1e7;j++);
Эта работа сводится к простой задержке времени. После этой паузы окно OwnedHwnd примет вид неактивного окна. При i=l после паузы окно OwnedHwnd примет вид активного окна, а при i=2 после паузы окно OwnedHwnd примет вид неактивного окна... Таким образом, окно OwnedHwnd 5 раз изменяет свой внешний вид.