- •Часть 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. Панель для выбора шрифта
П. 5.4 Сообщения и диалоговые панели
Большинство дочерних окон элементов управления посылают своему родительскому окну сообщения WM_COMMAND (исключение составляют полосы прокрутки). Более того, родительское окно может изменять состояние своих дочерних окон элементов управления (например, устанавливать и снимать метки с флажков), посылая дочерним окнам управления сообщения.
Аналогичным образом можно получать сообщения от элементов управления и изменять их состояние и в процедуре диалога. Кроме этого для работы с окнами управления в окнах диалога Windows обеспечивает разработчиков приложений еще несколькими возможностями.
Для посылки сообщений от родительского окна дочернему окну управления с дескриптором hWndControl используется оператор следующего вида:
SendMessage(hWndControl, сообщение, параметр_wParam, параметр_lParam);
Сложность в том, что процедуре диалога неизвестны дескрипторы дочерних окон элементов управления. Известен лишь идентификатор элемента управления, от которого приходит сообщение.
В Windows существует функция, которая позволяет получить дескриптор окна элемента управления диалоговой панели hDlg по идентификатору id элемента управления. С использованием этой функции предыдущий оператор приобретает следующий вид:
SendMessage(GetDlgItem(hDlg,id), сообщение, параметр_wParam, параметр_lParam);
Более того, специально для работы в процедурах диалога с элементами управления диалоговых окон в программном интерфейсе Windows существует ряд функций.
Первым усовершенствованием является специальная функция SendDlgItemMessage. Следующие вызовы эквивалентны:
SendDlgItemMessage(hDlg, id, iMsg, wParam, lParam);
и
SendMessage(GetDlgItem(hDlg, id),iMsg, wParam, lParam);
Существует также функция, которая снимает контрольные метки со всех радио-переключателей диалоговой панели hDlg с идентификаторами от idFirst до idLast, за исключением радио-переключателя с идентификатором idCheck, который, наоборот, включается:
CheckRadioButton(hDlg, idFirst, idLast, idCheck);
Похожая функция имеется и для работы с флажками. Если в окне диалога hDlg создается элемент управления CHECKBOX с идентификатором idCheckbox, то снять или установить контрольную метку (iCheck – 0/1) можно с помощью следующей функции:
CheckDlgButton(hDlg, idCheckbox, iCheck);
Чтобы получить состояние флажка в окне диалога в любой момент времени, можно использовать следующую функцию:
int iCheck=IsDlgButtonCkecked(hDlg, idCheckbox);
Перечислим кратко другие функции, облегчающие работу с элементами управления в процедуре диалога.
· Для заполнения списка LISTBOX именами файлов, каталогов и дисковых устройств предназначена функция DlgDirList.
· Для списка COMBOBOX определена аналогичная функция DlgDirListComboBox.
· Функция DlgDirSelect предназначена для получения из списка LISTBOX строки, выбранной пользователем.
· Аналогичная функция предусмотрена для списка COMBOBOX – DlgDirSelectComboBox.
· Функция SetDlgItemText позволяет изменить заголовок элемента управления или записать текст в текстовый редактор.
· Функция SetDlgItemInt позволяет записать в заголовок окна элемента управления или текстовый редактор текстовую строку, полученную после преобразования целого числа в формат строки символов.
· Для получения строки, связанной с элемента управления, можно использовать функцию GetDlgItemText.
· Предусмотрена также функция GetDlgItemInt, получающая из органа управления текстовую строку и выполняющая преобразование этой строки в целое число.
Табуляция и группы
Для того чтобы пользователь, например, имел возможность переходить при помощи клавиши <Tab> от одного дочернего окна элемента управления к другому в обычном не диалоговом родительском окне, приложение должно использовать технику введения новой оконной процедуры.
В окне диалога необходимость применения этой техники отпадает: Windows обеспечивает всю логику, необходимую для перемещения фокуса ввода с одного элемента управления на другое. Однако для этого необходимо включить в шаблон окна диалога при описании элементов управления стили WS_TABSTOP и WS_GROUP: для всех дочерних окон элементов управления, к которым необходим доступ с помощью клавиши <Tab>, задается стиль WS_TABSTOP.
Вторая возможность работы с клавиатурой, которую Windows предоставляет в окне диалога, включает в себя использование клавиш управления курсором. Эта возможность особенно важна для групп радио-переключателей.
Итак, пусть необходимо при помощи клавиши <Tab> передавать фокус отмеченному в данный момент времени радио-переключателю некоторой группы. Для передачи же фокуса от одного переключателя к другому внутри этой группы пусть необходимо использовать клавиши управления курсором.
Для использования клавиши <Tab> и клавиш управления курсором в группе элементов необходимо первому элементу из группы установить стиль WS_GROUP|WS_TABSTOP, а остальным элементам группы ни один из этих стилей не задавать.
Элементу управления, оператор определения которого стоит за определением последнего элемента группы, следует установить хотя бы стиль WS_GROUP (начало новой группы).
Windows будет использовать клавиши управления курсором для передачи фокуса ввода с первого элемента управления, имеющего стиль WS_GROUP (начало группы), на следующие элементы управления группы (но до элемента управления, имеющего стиль WS_GROUP - начало новой группы). При достижении последнего элемента группы, Windows будет циклически переходить снова не первый и т.д.
Замечание. По умолчанию дочерние окна управления LTEXT, CTEXT, RTEXT и ICON (все это статические поля) включают стиль WS_GROUP, который помечает конец предыдущей группы и начало следующей. Для дочерних окон элементов управления других типов часто необходимо добавлять стиль WS_GROUP.
Хотя, как правило, программисты позволяют менеджеру окна диалога брать передачу фокуса ввода внутри группы и при использовании табуляции на себя, в Windows есть две функции, которые дают возможность определить следующую или предыдущую позиции табуляции или окна группы:
HWND hWndControl=GetNextDlgTabItem(hDlg, hWndControlCurrent, bPrevious);
и
HWND hWndControl=GetNextDlgGroupItem(hDlg, hWndControlCurrent, bPrevious);
Если параметр bPrevious равен TRUE, то функции возвращают предыдущую позицию табуляции или окна группы, если FALSE – то следующую.