- •Часть 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. Панель для выбора шрифта
4.5.2. Управление состоянием кнопок панели
Панель инструментов во многом ведет себя как обычное окно. Например, в нем, кроме кнопок, можно расположить другие органы управления и управлять ими обычным способом. Но управление кнопками панели имеет свои отличия.
Для управления состоянием кнопок вызывают функцию SendMessage со специфическими для кнопок панели инструментов параметрами.
Примеры управления состоянием кнопок.
1. Заблокировать кнопку "Открыть":
SendMessage (hToolbar, TB_SETSTATE, (WPARAM)FILE_OPEN,
(LPARAM)MAKELONG(TBSTATE_INDETERMINATE,0));
2. Разблокировать кнопку "Сохранить":
SendMessage (hToolbar, TB_SETSTATE, (WPARAM)FlLE_SAVE,
(LPARAM)MAKELONG(TBSTATE_ENABLED,0));
3. Кнопку "Найти" отметить и оставить в доступном состоянии:
SendMessage (hToolbar, TB_SETSTATE, (WPARAM)CM_EDIT_FIND,
(LPARAM)MAKELONG(TBSTATE_CHECKED | TBSTATE_ENABLED,0));
4. Скрыть кнопку "Найти":
SendMessage (hToolbar, TB_SETSTATE, (WPARAM)CM_EDIT_FIND,
(LPARAM)MAKELONG(TBSTATE_HIDDEN,0));
4.5.3. Вывод подсказок в панели инструментов
При остановке курсора мыши над любой кнопкой панели инструментов можно отображать текст подсказки, связанный с этой кнопкой. Для этого используют механизм уведомительных сообщений, при котором у функции окна можно запросить текст и отобразить его.
Панель инструментов функции родительского окна посылает уведомительное сообщение WM_NOTIFY о том, что с ней что-то сделали или требуется дополнительная информация. Для идентификации отправителя и истолкования сообщения используют параметр lParam. Он указывает на структуру типа NMHDR, которая содержит код и дополнительную информацию сообщения. После обработки сообщения WM_NQTIFY можно возвращать любое значение.
Структура NMHDR описана следующим образом:
typedef struct {
HWND hwndFrom;
UlNT idFrom;
UINT code;
} NMHDR;
Здесь hwndFrom - дескриптор пославшего сообщение органа управления,
idFrom - идентификатор этого органа управления,
code - специфический для органа управления код сообщения.
Структура NMHDR обычно является частью структуры более высокого уровня. В случае панели инструментов она является частью структуры ТООLTIРТЕХТ: typedef struct
{ NMHOR hdr;
LPTSTR lpszText;
char szText|80];
HINSTANCE hinst;
UINT uFlags;
} TOOLTIPTEXT;
Назначение полей этой структуры:
1. hdr – cтруктypa типа NMHDR.
2. lpszText - указатель на строку, которая содержит или получает текст для панели инструментов,
3. szText - буфер для получения текста от панели инструментов.
4. hinst - дескриптор приложения, которое содержит строковый ресурс.
Если 1рszТехt указывает на строку, hinst=NULL.
5. uFlags - флажок, который указывает, как интерпретировать значение
поля idFrom структуры hdr. Если uFlags=TTF_IDISHWND, то idFrom- дескриптор, иначе idFrom - идентификатор кнопки панели инструментов.
Эти структуры обычно описывают и инициируют после получения сообщения WM_NOTIFY. Например, следующим образом:
-
Описывают указатель на структуру типа TOOLTIPTEXT:
LPTOOLTIPTEXT TTStr;
2 Cвязывают указатель TTStr с параметром lParam:
TTStr=(LPTOOLTIPTEXT)lParam;
3. Далее анализируют код сообщения и принимают соответствующее решение.
Например, в случае организации подсказок, анализ сводится к проверке:
if (TTstr->hdr.code!=TTN_NEEDTEXT) return 0;
То есть обработку завершают, если код не равен TTN_NEEDTEXT. Сообщение TTN_NEEDTEXT говорит, что для панели инструментов требуется текст.
4. Представим, что принято уведомительное сообщение от кнопки панели о том, что требуется некий текст. Тогда определяют идентификатор этой кнопки и записывают соответствующий текст. Эту процедуру можно реализовать многими способами. Например:
switch (TTStr->hdr.idFrom) {
case CM_FILE_NEW.
{ TTStr->lpszText="Coздать новый документ";
return 0; }
. . .
default: return 0; }
В качестве подсказки можно посылать любые тексты (даже с управляющими символами типа \n).
Пример. Обеспечить выдачу подсказок в момент остановки курсора мыши над кнопкой панели.
case WM_NOTIFY:
{ LPTOOLTIPTEXT TTStr;
TTStr=(LPTOOLTIPTEXT)IParam;
if(TTStr->hdr,code!=TTN_NEEDTEXT) return 0;
switch (TTStr->hdr.idFrom)
{ case CM_FILE_NEW:
{ TTStr->lpszText="Coздать новый документ"; return 0;
}
case CM_FILE_OPEN:
{ TTStr ->lpszText=”Открыть существующий документ"; return 0;
}
caseCM_FILE_SAVE:
{ TTStr->lpszText="Coxpaнить текущий документ"; return 0;
}
default: return 0;
} return 0;
}
Для работы этого фрагмента программы необходимо:
-
Описать идентификатор панели инструментов:
#define ID_TOOLBAR 100
2. Для того чтобы кнопки панели инструментов посылали сообщение WM_NOTIFY, стиль dwStyle окна панели инструментов следует указывать:
dwStyte=WS_CHILD | WS_VISIBLE |TBSTYLE_TOOLTIPS | WS_DLGFRAME;
Подсказки будут появляться в том случае, если кнопка отображена на панели. При этом операционную систему не интересует состояние кнопки: достаточно того, что кнопка посылает уведомительное сообщение WM_NOTIFY.
Данный способ обработки сообщения WM_NOTIFY отличается простотой, наглядностью и информативностью сообщений. Например, можно выдать большее сообщение:
TTStr->lpszText= "Добро пожаловать в справочную систему:\n\n" "
-
Найдите ответы на возникающие вопросы\n\n"
-
Просмотрите электронную версию справочника.";