- Главная
- Информатика
- Принципы работы с элементами управления. Лекция 6
Содержание
- 2. Введение Любое стандартное приложение Windows использует различные элементы управления, такие, как кнопки, полосы просмотра, редакторы текстов
- 3. Введение Стандартные дочерние окна управления имеют вид кнопок, флажков, окон редактирования, списков, комбинированных списков, строк текста
- 4. Создание дочерних окон Вызывая специальные функции, можно динамически перемещать элемент управления (MoveWindow - функция определяет новое
- 5. Создание дочерних окон Для создания дочернего окна элементов управления необходимо вызвать функцию CreateWindow. С помощью этой
- 6. Создание дочерних окон Параметр hWndParent определяет дескриптор родительского окна, на поверхности которого создается дочернее окно. Параметр
- 7. Создание дочерних окон Пример создания обычной кнопки в оконной процедуре главного окна приложнения: static UINT ID_button=1;
- 8. Сообщения дочерних окон родительскому окну Если элемент управления изменяет свое состояние, то функция родительского окна получает
- 9. Сообщения дочерних окон родительскому окну Пример оконной процедуры родительского окна, в котором происходит обработка нажатия на
- 10. Сообщения родительского окна дочерним окнам Родительское окно также может передавать сообщения дочерним окнам, в ответ на
- 11. Сообщения родительского окна дочерним окнам Каждое дочернее окно имеет дескриптор окна (тип HWND) и идентификатор окна
- 12. Дочерние окна и фокус ввода Дочерние элементы управления получают фокус при щелчке мыши на них. Когда
- 13. Вызывая функцию SetWindowLong можно не только получить адрес оконной процедуры дочернего окна управления, но и установить
- 14. Дочерние окна управления и цвет Чтобы дочерние окна управления выглядели привлекательно, необходимо либо как-то изменить цвет
- 15. При определении класса родительского окна для фона рабочей области можно использовать системный цвет, например COLOR_BTNFACE: wndclass.hbrBackground=(HBRUSH)(COLOR_BTNFACE+1);
- 16. Для изменения цвета и фона текста, выводимого в рабочей области родительского окна, на системные цвета, необходимо
- 17. Приступим к обсуждению решения проблемы цвета вторым способом. Когда дочернее окно управления собирается рисовать свою рабочую
- 18. Рассмотрим пример управления цветом кнопки. Когда кнопка собирается рисовать свою рабочую область, она посылает процедуре родительского
- 19. Приведем пример обработки сообщения WM_CTLCOLORBTN родительским окном. Предполагается, что кисть hBrushBack создается оконной процедурой родительского окна
- 20. Для создания кнопки приложение должно создать дочернее окно на базе предопределенного класса “button”, например: static UINT
- 21. Родительские окна могут посылать следующие сообщения кнопкам: BM_GETCHECK и BM_SETCHECK - для установки и снятия меток
- 22. Нажимаемые кнопки (push buttons) представляют собой прямоугольник, внутри которого находится текст, заданный в параметре текста окна
- 23. Приложение может имитировать нажатие кнопки, посылая окну сообщение BM_SETSTATE. Следующий оператор приводит к “нажатию” кнопки: SendMessage(hWndButton,BM_SETSTATE,1,0l);
- 24. Флажки (check boxes) представляют собой маленькие квадратные окна с размещенным обычно справа от окна текстом (если
- 25. При стиле BS_AUTOCHECKBOX флажок самостоятельно включает и выключает контрольную метку, и оконная процедура родительского окна может
- 26. Радио-переключатели Радио-переключатели (radio buttons, радио-кнопки) похожи на флажки, но их форма не квадратная, а круглая. Жирная
- 27. Окна групп Окна групп (group boxes) – стиль BS_GROUPBOX – является исключением в классе кнопок. Они
- 28. Кнопки, определяемые пользователем Если есть необходимость полного управления внешним видом кнопки, но нет желания реализовывать логику
- 29. Кнопки, определяемые пользователем Структура DRAWITEMSTRUCT содержит информацию, необходимую программе для рисования кнопки (такая же структура используется
- 30. Статическое дочернее окно управления Статическое дочернее окно управления - это окно, создаваемое на базе предопределенного класса
- 31. Статическое дочернее окно управления Рассмотрим стили статического дочернего окна Первые шесть стилей – SS_BLACKRECT, SS_GRAYRECT, SS_WHITERECT
- 32. Поля ввода В Windows зарегистрирован класс окна с именем “edit”, на базе которого можно создать однострочный
- 33. Поля ввода Рассмотрим стили окон редактирования Текст в управляющих окнах редактирования может быть выравнен либо по
- 34. Поля ввода Рассмотрим, как окна редактирования уведомляют родительское окно о тех изменениях, которые с ними происходят
- 35. Поля ввода Родительские окна также могут посылать окнам редактирования сообщения Специфических сообщений, которые родительское окно может
- 36. Элемент управления «Список» С помощью класса “listbox” можно создавать одноколоночные и многоколоночные списки, имеющие вертикальную (для
- 37. Элемент управления «Список» Рассмотрим стили окон списков При задаваемом по умолчанию стиле окна списка (только стиль
- 38. Элемент управления «Список» В заголовочных файлах Windows определяется стиль списка, который называется LBS_STANDARD. Стиль LBS_STANDARD включает
- 39. Элемент управления «Список» Специфических сообщений, которые родительское окно может послать окну списка при помощи функции SendMessage,
- 40. Элемент управления «Список» Самым мощным сообщение для окон списка является сообщение LB_DIR. Следующий оператор заполняет список
- 41. Элемент управления «Список» Вот как будет, например, выглядеть вызов, выводящий в список имена всех файлов текущего
- 42. Элемент управления «Список» Для обработки сообщения от списка оконная функция родительского окна может содержать код следующего
- 43. Выпадающий список Этот класс является комбинацией списка и однострочного редактора, поэтому для комбинированного списка используются стили,
- 44. Выпадающий список Рассмотрим базовые стили комбинированного списка Среди всех стилей комбинированного списка можно выделить три базовых:
- 45. Выпадающий список Для обработки сообщения от комбинированного списка оконная функция родительского окна может содержать код следующего
- 46. Для обработки сообщения от комбинированного списка оконная функция родительского окна может содержать код следующего вида: case
- 47. Полосы прокрутки Для создания дочернего окна управления типа полоса прокрутки приложение должно вызвать функцию CreateWindow, передав
- 48. Полосы прокрутки Замечание. Полосы прокрутки – элементы управления можно сделать любого размера. Для того чтобы создать
- 49. Полосы прокрутки Приведем пример обработки сообщений от полосы прокрутки – дочернего окна управления. Пусть в окне
- 50. Дополнительные элементы Для упрощения создания Windows-приложений с интерфейсом пользователя, соответствующим элегантному интерфейсу оболочки системы Windows, фирма
- 51. Дополнительные элементы Другие элементы управления Animation (анимационное изображение) - Проигрывает анимационную последовательность для индикации длительной операции.
- 52. Основы общих элементов управления Каждый элемент управления общего пользования, за исключением списка изображений, реализован как класс
- 53. Основы общих элементов управления Наиболее важно при работе с элементами управления обоих типов помнить, что элемент
- 54. Инициализация библиотек и элементов общего пользования Различные описания, которые необходимы для использования элементов управления общего пользования
- 55. Инициализация библиотек и элементов общего пользования Ввиду размера и сложности усовершенствованного редактора, он располагается в его
- 56. Создание элементов общего пользования Создание элементов управления общего пользования Наиболее общий путь создания окна элемента управления
- 57. Создание элементов общего пользования Как показано в примере, дочерние окна часто создаются с начальным местоположением (x,y)
- 58. Создание элементов общего пользования Приведем все имена классов элементов управления общего пользования и функции их создания.
- 59. Посылка сообщений общим элементам управления После создания окна общего элемента для управления его действиями ему посылаются
- 60. Уведомляющие сообщения от общих элементов управления Как и предопределенные элементы управления, общие элементы управления посылают своему
- 61. Уведомляющие сообщения от общих элементов управления Приведем фрагмент программы, в котором демонстрируется последовательность действий при обработке
- 63. Скачать презентацию
Слайд 2Введение
Любое стандартное приложение Windows использует различные элементы управления, такие, как кнопки, полосы
Введение
Любое стандартное приложение Windows использует различные элементы управления, такие, как кнопки, полосы
Дочерние окна управления (улементы управления)
Так как дочерние окна располагаются на поверхности окна родителя, “прилипая” к ним, приложение может создать в любом своем окне несколько элементов управления, которые будут перемещаться вместе с окном-родителем.
Для этого достаточно создать нужные дочерние окна, указав их размеры, расположение и некоторые другие атрибуты. После этого приложение может взаимодействовать с элементами управления, передавая или получая от них различные сообщения.
Каждое дочернее окно создается с помощью вызова функции CreateWindow. Оконная процедура родительского окна посылает сообщения дочерним окнам управления, а дочерние окна управления посылают сообщения обратно оконной процедуре.
Дочернее окно управления обрабатывает сообщения мыши и клавиатуры и извещает родительское окно о том, что состояние дочернего окна изменилось. В этом случае
Дочернее окно становится для родительского окна устройством ввода. Оно инкапсулирует особые действия, связанные с графическим представлением окна на экране, реакцией на пользовательский ввод, и извещения другого окна при вводе важной информации.
Слайд 3Введение
Стандартные дочерние окна управления имеют вид кнопок, флажков, окон редактирования, списков, комбинированных
Введение
Стандартные дочерние окна управления имеют вид кнопок, флажков, окон редактирования, списков, комбинированных
Для создания дочернего окна управления собственного класса, во-первых, следует определить класс окна и зарегистрировать его в Windows функцией RegisterClass. Затем с помощью функции CreateWindow необходимо создать окно на основе этого класса.
Однако, Если создается одно из предопределенных дочерних окон управления, то для этого дочернего окна класс окна регистрировать не надо. Такой класс уже существует в Windows и имеет одно из следующих имен: “button”, ”edit”, “static”, “listbox”, “combobox” и “scrollbar”. Приложение просто использует одно из этих имен в качестве параметра в функции CreateWindow.
Параметр стиля окна функции CreateWindow более точно определяет вид и свойства дочернего окна управления. Windows включает в себя оконные процедуры, обрабатывающие сообщения тех дочерних окон, которые созданы на основе перечисленных классов.
Слайд 4Создание дочерних окон
Вызывая специальные функции, можно
динамически перемещать элемент управления (MoveWindow -
Создание дочерних окон
Вызывая специальные функции, можно
динамически перемещать элемент управления (MoveWindow -
делать его активным или неактивным (EnableWindow, для определения, является ли окно заблокированным, используется функция IsWindowEnabled),
скрывать его или отображать (ShowWindow),
изменять заголовок окна (SetWindowText),
искать окна (FindWindow)
работать с областью окна GetClientRect
уничтожить созданный элемент управления (DestroyWindow).
Слайд 5Создание дочерних окон
Для создания дочернего окна элементов управления необходимо вызвать функцию CreateWindow.
Создание дочерних окон
Для создания дочернего окна элементов управления необходимо вызвать функцию CreateWindow.
HWND CreateWindow(LPCSTR lpClassName, LPCSTR lpWindowName, DWORD dwStyle, int x, int y, int nWidth, int nHeight,HWND hWndParent, HMENU hMenu, HANDLE hInstance, LPVOID *lpParam); Параметр функции lpClassName - указатель на строку, содержащую имя класса, на базе которого создается окно. Для создания кнопки, например, необходимо указать имя класса “button”.
Параметр lpWindowName - указатель на строку, содержащую текст окна. Для элементов управления - это либо надпись на кнопке, либо текст в поле редактирования, либо что-то иное в зависимости от типа элемента управления.
Параметр dwStyle - стиль создаваемого окна. Этот параметр задается как логическая комбинация отдельных битов. Для дочерних окон управления следует задать стиль как комбинацию констант WS_CHILD, WS_VISIBLE, WS_CLIPSIBLINGS и констант, определяющих стили элемента управления.
Параметры x и y определяют положение верхнего левого угла дочернего окна относительно верхнего левого угла рабочей области родительского окна.
Параметры nWidth и nHeight определяют ширину и высоту создаваемого элемента управления.
Слайд 6Создание дочерних окон
Параметр hWndParent определяет дескриптор родительского окна, на поверхности которого создается
Создание дочерних окон
Параметр hWndParent определяет дескриптор родительского окна, на поверхности которого создается
Параметр hMenu - идентификатор порожденного (child) окна. Для каждого создаваемого дочернего окна необходимо определить собственный уникальный идентификатор. Родительское окно будет получать от дочерних окон сообщения WM_COMМAND. При помощи идентификатора элемента управления оконная процедура родительского окна сможет определить дочернее окно, пославшее ей сообщение.
Параметр hInstance - дескриптор экземпляра копии приложения, которое создает окно. Необходимо использовать значение, передаваемое функции WinMain через параметр hInstаnce.
Последний параметр lpParam используется для передачи окну дополнительных данных. При создании дочерних окон управления он должен быть равен NULL.
Константы, идентифицирующие стили предопределенных классов элементов управления, определены в заголовочных файлах Windows и имеют соответственно следующие префиксы: BS_ - “button”, ES_ - ”edit”, SS_ - “static”, LBS_ - “listbox”, CBS_ - “combobox” и SBS_ - “scrollbar”.
Слайд 7Создание дочерних окон
Пример создания обычной кнопки в оконной процедуре главного окна приложнения:
static
Создание дочерних окон
Пример создания обычной кнопки в оконной процедуре главного окна приложнения:
static
После вызова CreateWindow оконные процедуры дочерних окон управления внутри Windows поддерживают их работу и управляют всеми процессами перерисовки (за исключением кнопки стиля BS_OWNERDRAW).
При необходимости созданные дочерние окна можно удалить функцией DestroyWindow. При завершении работы программы, когда удаляется родительское окно, Windows сама удаляет и дочерние окна.
Слайд 8Сообщения дочерних окон родительскому окну
Если элемент управления изменяет свое состояние, то функция
Сообщения дочерних окон родительскому окну
Если элемент управления изменяет свое состояние, то функция
LOWORD(wParam) - идентификатор дочернего окна (тип UINT); HIWORD(wParam) - код уведомления (тип UINT); lParam - дескриптор дочернего окна (тип HWND). Идентификатор дочернего окна – это значение, передаваемое функции CreateWindow, когда создается рабочее окно.
Дескриптор дочернего окна – это значение, которое Windows возвращает при вызове функции CreateWindow.
Код уведомления – это дополнительный код, который дочернее окно использует для того, чтобы сообщить родительскому окну более точные сведения о сообщении.
Константы, идентифицирующие различные коды уведомления, определены в заголовочных файлах Windows и имеют соответственно следующие префиксы: BN_ - “button”, EN_ - “edit”, LBN_ - “listbox”, CBN_ - “combobox” и SB_ - “scrollbar”.
Слайд 9Сообщения дочерних окон родительскому окну
Пример оконной процедуры родительского окна, в котором происходит
Сообщения дочерних окон родительскому окну
Пример оконной процедуры родительского окна, в котором происходит
case WM_COMMAND: {
UINT idCtl=LOWORD(wParam); // идентификатор дочернего окна
UINT code=HIWORD(wParam); // код уведомления
HWND hChild=(HWND)lParam; // дескриптор дочернего окна
if(idCtl==ID_button&&code==BN_CLICKED) { // кнопка была нажата
CloseWindow(hWnd); // закрыть окно-родителя
}
}; return 0;
Слайд 10Сообщения родительского окна дочерним окнам
Родительское окно также может передавать сообщения дочерним окнам,
Сообщения родительского окна дочерним окнам
Родительское окно также может передавать сообщения дочерним окнам,
Передать можно как обычное оконное сообщение (с префиксом WM_), так и специфические для каждого типа элемента управления
Константы, идентифицирующие различные сообщения для дочерних окон управления, определены в заголовочных файлах Windows и имеют соответственно следующие префиксы: BM_ - “button”, EM_ - “edit”, LB_ - “listbox”, CB_ - “combobox”. Для работы с окнами класса “scrollbar” применяются специальные Set/Get-функции WinAPI.
Существует два способа передачи сообщений.
Первый способ передачи сообщений - запись сообщения в очередь приложения. Он основан на использовании функции PostMessage. Записанное при помощи функции PostMessage сообщение будет выбрано и обработано в цикле обработки сообщений.
(Асинхронные сообщения)
Второй способ передачи сообщений - непосредственная передача сообщения функции окна, минуя очередь сообщений. Этот метод реализуется функцией SendMessage. Функция SendMessage вызывает функцию окна и возвращает управление только после возврата из функции окна, которому передано сообщение.
(Синхронные сообщения)
Слайд 11Сообщения родительского окна дочерним окнам
Каждое дочернее окно имеет дескриптор окна (тип HWND)
Сообщения родительского окна дочерним окнам
Каждое дочернее окно имеет дескриптор окна (тип HWND)
Если известен дескриптор hWndChild дочернего окна, то можно получить его идентификатор:
UINT id=GetWindowLong(hWndChild,GWL_ID);
Также можно использовать другую функцию (хотя часть “Dlg” имени функции относится к окну диалога, на самом деле это функция общего назначения):
UINT id=GetDlgCtrlID(hWndChild);
Зная идентификтор id дочернего окна, можно получить его дескриптор:
HWND hWndChild=GetDlgItem(hWndParent,id);
Пример сообщения родительского окна hWnd дочернему окну класса “edit”.
Окну редактирования c дескриптором hWndEdit передается сообщение об установке максимального количества вводимых символов (5 символов):
static UINT ID_edit=3;
static HWND hWndEdit; . . .
hWndEdit=CreateWindow("edit",NULL, WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS| WS_BORDER|ES_LEFT, x,y,width,height,hWnd,(HMENU)ID_edit,hInst,NULL);
. . .
SendMessage(hWndEdit,EM_LIMITTEXT,5,0L);
Слайд 12Дочерние окна и фокус ввода
Дочерние элементы управления получают фокус при щелчке мыши
Дочерние окна и фокус ввода
Дочерние элементы управления получают фокус при щелчке мыши
Такая ситуация создает очевидную проблему: приложение теряет контроль над обработкой сообщений от клавиатуры.
Примером является то, что перекрывающееся окно не имеет возможности обеспечить переход пользователя от элемента управления к элементу управления с помощью клавиш
Решение этой проблемы состоит в использовании приема, называемого созданием подкласса окна (window subclassing, разбиение на подклассы, установка новой оконной процедуры).
Оконная процедура дочерних окон управления находится в недрах Windows. Однако, можно получить адрес этой оконной процедуры с помощью вызова GetWindowLong, в котором в качестве параметра используется идентификатор GWL_WNDPROC.
Слайд 13Вызывая функцию SetWindowLong можно не только получить адрес оконной процедуры дочернего окна
Вызывая функцию SetWindowLong можно не только получить адрес оконной процедуры дочернего окна
Это очень мощный прием, он позволяет “влезть” в существующие внутри Windows оконные процедуры, обработать некоторые сообщения специфическим для приложения способом, а все остальные сообщения оставить прежней оконной процедуре.
Так, например, новые оконные процедуры дочерних окон управления при получении сообщений о нажатии клавиш
Дочерние окна и фокус ввода
Слайд 14Дочерние окна управления и цвет
Чтобы дочерние окна управления выглядели привлекательно, необходимо
либо как-то
Дочерние окна управления и цвет
Чтобы дочерние окна управления выглядели привлекательно, необходимо
либо как-то
Изменить настройку цветов окон управления.
Изменение цвета рабочей области окна
Рассмотрим теперь первый способ решения проблемы цвета. Предварительно обсудим, как Windows использует системные цвета (system colors).
Windows поддерживает 25 системных цветов, предназначенных для отрисовки различных элементов экрана. Приложение может получить или установить текущие значения этих цветов (на время текущего сеанса Windows) с помощью функций GetSysColor и SetSysColor и идентификаторов системных цветов. Идентификаторы системных цветов с префиксом COLOR_, определены в заголовочных файлах Windows.
Например, цвет COLOR_BTNFACE является основным цветом поверхности нажимаемых кнопок и цветом фона остальных (этот же цвет используется в окнах диалога и сообщений). А цвет COLOR_WINDOWTEXT для флажков и радио-переключателей используется как цвет текста.
Теперь приведем цвет фона рабочей области родительского окна, цвет фона текста и цвет самого текста в соответствие с, например, цветами кнопок. Сначала обсудим, как можно изменить цвет рабочей области родительского окна.
Слайд 15При определении класса родительского окна для фона рабочей области можно использовать системный
При определении класса родительского окна для фона рабочей области можно использовать системный
wndclass.hbrBackground=(HBRUSH)(COLOR_BTNFACE+1); Windows понимает, что если значение поля hbrBackground такое низкое, то оно фактически ссылается на системный цвет, а не реальный дескриптор кисти. Windows в этом случае требует, чтобы при использовании идентификаторов системных цветов к ним прибавляли 1 (чтобы это значение не стало равным NULL).
Если выводить текст на экран, используя функцию TextOut, то Windows для цвета фона текста (цвет, который стирает фон позади текста) и цвета самого текста использует значения, определенные в контексте устройства. По умолчанию это белый (фон) и черный (текст) цвета вне зависимости от системных цветов и поля hbrBackground структуры класса окна.
Дочерние окна управления и цвет
Слайд 16Для изменения цвета и фона текста, выводимого в рабочей области родительского окна,
Для изменения цвета и фона текста, выводимого в рабочей области родительского окна,
SetBkColor(hDC,GetSysColor(COLOR_BTNFACE)); SetTextColor(hDC,GetSysColor(COLOR_WINDOWTEXT));
В итоге цвет фона рабочей области родительского окна, цвет фона текста и цвет самого текста приведены в соответствие с цветом кнопок.
Дочерние окна управления и цвет
Слайд 17Приступим к обсуждению решения проблемы цвета вторым способом.
Когда дочернее окно управления
Приступим к обсуждению решения проблемы цвета вторым способом.
Когда дочернее окно управления
Родительское окно на основании этого сообщения может менять цвета, которые будет использовать оконная процедура дочернего окна при рисовании.
В итоге
Родительское окно может управлять цветами своих дочерних окон. Именно обработка сообщений запроса дочерними окнами информации о цвете и есть второй способ решение проблемы несогласованности цветов.
Настройка цветов дочерних окон управления
Слайд 18Рассмотрим пример управления цветом кнопки. Когда кнопка собирается рисовать свою рабочую область,
Рассмотрим пример управления цветом кнопки. Когда кнопка собирается рисовать свою рабочую область,
Когда оконная процедура родительского окна получает сообщение WM_CTLCOLORBTN, то параметр wParam этого сообщения является дескриптором контекста устройства кнопки, а параметр lParam – дескриптором окна кнопки.
Родительское окно в случае обработки этого сообщения в своей оконной процедуре: необязательно устанавливает цвет фона текста функций SetBkColor; необязательно устанавливает цвет текста функций SetTextColor; обязательно возвращает дескриптор кисти дочернему окну.
Теоретически, дочернее окно использует кисть для рисования фона. Необходимо удалить кисть, когда она становится ненужной.
Настройка цветов дочерних окон управления
Слайд 19Приведем пример обработки сообщения WM_CTLCOLORBTN родительским окном. Предполагается, что кисть hBrushBack создается
Приведем пример обработки сообщения WM_CTLCOLORBTN родительским окном. Предполагается, что кисть hBrushBack создается
case WM_CTLCOLORBTN:
{ HDC hdcButton = (HDC) wParam;
HWND hChild = (HWND) lParam; SetBkColor(hdcButton,RGB(0,255,0)); SetBkMode(hdcButton,TRANSPARENT); SetTextColor(hdcButton, RGB(0,0,0));
POINT point; point.x=point.y=0;
ClientToScreen(hWnd,&point); SetBrushOrg(hdcButton,point.x,point.y); UnrealizeObject(hBrushBack);
}; return(hBrushBack);
Настройка цветов дочерних окон управления
Слайд 20Для создания кнопки приложение должно создать дочернее окно на базе предопределенного класса
Для создания кнопки приложение должно создать дочернее окно на базе предопределенного класса
static UINT ID_button=1; static HWND hWndButton; . . . hWndButton=CreateWindow("button","Text", WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|BS_PUSHBUTTON, x,y,width,height, hWndParent,(HMENU)ID_button,hInst,NULL); Родительское окно будет получать от кнопки сообщение WM_COMMAND с кодом уведомления BN_CLICKED. Этим сообщением кнопка информирует родительское окно о том, что с ней что-то сделали. Для обработки сообщения оконная функция родительского окна может содержать код следующего вида:
case WM_COMMAND: { UINT idCtl=LOWORD(wParam); // идентификатор дочер. окна UINT code=HIWORD(wParam); // код уведомления HWND hChild=(HWND)lParam; // дескриптор дочер. окна if(idCtrl==ID_button&&code==BN_CLICKED) { // сообщение о том, что нажата кнопка // с идентификатором ID_button . . . } }; return 0;
Кнопки
Слайд 21Родительские окна могут посылать следующие сообщения кнопкам:
BM_GETCHECK и BM_SETCHECK - для
Родительские окна могут посылать следующие сообщения кнопкам:
BM_GETCHECK и BM_SETCHECK - для
BM_GETSTATE и BM_SETSTATE - для установки состояния “нажата/отпущена” всех типов кнопок;
BM_SETSTYLE - для изменения стиля любой кнопки после ее создания.
Следует заметить, что
Только нажимаемые кнопки и кнопки, определяемые пользователем, посылают своему родительскому окну сообщение WM_CTLCOLORBTN.
Кроме того, только кнопки, определяемые пользователем, реагируют на обработку сообщения родительским окном, используя кисть для закрашивания фона.
А это совершенно бесполезно, поскольку за рисование кнопок, определяемых пользователем, и так отвечает родительское окно.
Кнопки
Слайд 22Нажимаемые кнопки (push buttons) представляют собой прямоугольник, внутри которого находится текст, заданный
Нажимаемые кнопки (push buttons) представляют собой прямоугольник, внутри которого находится текст, заданный
Нажимаемые кнопки управления используются в основном для запуска немедленного действия без сохранения какой-либо индикации кнопки типа “включено/выключено”. Эти два типа нажимаемых кнопок управления имеют стили, которые называются BS_PUSHBUTTON и BS_DEFPUSHBUTTON (символы “DEF” означают “по умолчанию – default”).
Функционирование кнопок этих двух стилей при использовании их в диалоговых окнах отличается друг от друга.
Если же их использовать в обычных перекрывающихся окнах, то эти два типа нажимаемых кнопок действуют одинаково, хотя кнопка BS_DEFPUSHBUTTON имеет более жирную рамку.
Когда курсор мыши находится на нажимаемой кнопке и левая клавиша мыши нажата, то кнопка перерисовывается так, чтобы выглядеть нажатой.
Отпускание клавиши мыши, когда курсор мыши находится на нажимаемой кнопке, приводит к восстановлению облика кнопки и посылке родительскому окну сообщения WM_COMMAND с кодом нотификации BN_CLICKED.
Нажимаемые кнопки
Слайд 23Приложение может имитировать нажатие кнопки, посылая окну сообщение BM_SETSTATE. Следующий оператор приводит
Приложение может имитировать нажатие кнопки, посылая окну сообщение BM_SETSTATE. Следующий оператор приводит
SendMessage(hWndButton,BM_SETSTATE,1,0l); // wParam=1 – нажата Следующий вызов заставляет кнопку вернуться к своему нормальному состоянию:
SendMessage(hWndButton,BM_SETSTATE,0,0l); // wParam=0 – отпущена Также можно послать нажимаемой кнопке сообщение BM_GETSTATE. Дочерняя кнопка управления возвращает текущее состояние – TRUE, если кнопка нажата и FALSE (или 0), если она в обычном состоянии:
int press= SendMessage(hWndButton,BM_GETSTATE,0,0l); if(press) { /* кнопка нажата */ } else { /* кнопка в нормальном состоянии */ } Замечание. Поскольку нажимаемая кнопка не сохраняет информацию о своем положении типа “включено/выключено”, сообщения BM_GETCHECK и BM_SETCHECK не используются.
Нажимаемые кнопки
Слайд 24Флажки (check boxes) представляют собой маленькие квадратные окна с размещенным обычно справа
Флажки (check boxes) представляют собой маленькие квадратные окна с размещенным обычно справа
Флажки, как правило, действуют как двухпозиционные переключатели: один щелчок вызывает появление контрольной метки (состояние “включено”); другой щелчок приводит к исчезновению этой метки (состояние “выключено”).
В приложениях флажки обычно объединяются, что дает пользователю возможность установить опции. Двумя наиболее используемыми стилями для флажков являются BS_CHECKBOX и BS_AUTOCHECKBOX.
При использовании стиля BS_CHECKBOX приложение само должно устанавливать контрольную метку, посылая сообщение BM_SETCHECK. В этом случае обработка родительским окном сообщения WM_COMMAND с кодом нотификации BN_CLICKED от флажка с идентификатором ID_button могла бы быть следующей:
case WM_COMMAND: { UINT idCtl=LOWORD(wParam); // идентификатор дочер. окна UINT code=HIWORD(wParam); // код уведомления HWND hChild=(HWND)lParam; // дескриптор дочер. окна if(idCtrl==ID_button&&code==BN_CLICKED) { int cur_label= SendMessage(hWndButton,BM_GETCHECK,0,0l); SendMessage(hChild,BM_SETCHECK,(WPARAM)(!cur_label),0l); } }; return 0;
Флажки-переключатели
Слайд 25При стиле BS_AUTOCHECKBOX флажок самостоятельно включает и выключает контрольную метку, и оконная
При стиле BS_AUTOCHECKBOX флажок самостоятельно включает и выключает контрольную метку, и оконная
Если приложению необходимо инициализировать флажок меткой (установить состояние “включено”), то ему следует послать сообщение BM_SETCHECK c параметром wParam, равным 1 (значение 0 снимает с флажка метку):
SendMessage(hWndButton,BM_SETCHECK,1,0l); Если необходимо узнать текущее состояние флажка, то для этого можно послать сообщение BM_GETCHECK:
int iCheck=SendMessage(hWndButton,BM_GETCHECK,0,0l); Полученное значение равно TRUE (не равно 0), если флажок отмечен (“включен”) или FALSE (или 0), если не отмечен.
Двумя другими стилями флажков являются BS_3STATE и BS_AUTO3STATE. Как показывают их имена, эти стили могут отображать третье состояние – серый цвет внутри окна флажка – которое имеет место, когда такому флажку посылается сообщение BM_SETCHECK с параметром, равным 2.
Серый цвет показывает пользователю, что его выбор неопределен или не имеет отношения к делу. В этом случае флажок не может быть включен – т.е. он запрещает какой-либо выбор в данный момент. Однако флажок продолжает посылать сообщения родительскому окну, если щелкать на нем мышью.
Флажки-переключатели
Слайд 26Радио-переключатели
Радио-переключатели (radio buttons, радио-кнопки) похожи на флажки, но их форма не квадратная,
Радио-переключатели
Радио-переключатели (radio buttons, радио-кнопки) похожи на флажки, но их форма не квадратная,
Радио-кнопка может иметь стиль окна BS_RADIOBUTTON или BS_AUTORADIOBUTTON, но последний используется только в окнах диалога. В окнах диалога группы радио-переключателей, как правило, используются для индикации нескольких взаимоисключающих опций. В отличие от флажков, если повторно щелкнуть на радио-кнопке, то ее состояние не изменится.
При получении сообщения WM_COMMAND с кодом нотификации BN_CLICKED от радио-переключателя с идентификатором ID_button, необходимо отобразить его отметку, отправив сообщение BM_SETCHECK с параметром wParam, равным 1. Для остальных переключателей этой группы можно отключить контрольную метку, послав сообщение BM_SETCHECK с параметром wParam, равным 0:
case WM_COMMAND: { UINT idCtl=LOWORD(wParam); // идентификатор дочер. окна UINT code=HIWORD(wParam); // код уведомления HWND hChild=(HWND)lParam; // дескриптор дочер. окна if(idCtrl==ID_button&&code==BN_CLICKED) { SendMessage(hChild,BM_SETCHECK,1,0l); // для всех остальных радиопереключателей группы - снять метки SendMessage(hWndOtherButton,BM_SETCHECK,0,0l); . . . } }; return 0;
Слайд 27Окна групп
Окна групп (group boxes) – стиль BS_GROUPBOX – является исключением в
Окна групп
Окна групп (group boxes) – стиль BS_GROUPBOX – является исключением в
Окно группы представляет собой прямоугольную рамку с текстом наверху. Окна групп часто используют для того, чтобы в них размещать другие дочерние окна управления.
Слайд 28Кнопки, определяемые пользователем
Если есть необходимость полного управления внешним видом кнопки, но нет
Кнопки, определяемые пользователем
Если есть необходимость полного управления внешним видом кнопки, но нет
Большинство программ, в которых для рисования собственных кнопок используется стиль кнопки BS_OWNERDRAW, часто для изображения применяют небольшие растровые образы.
Кнопки стиля BS_OWNERDRAW при необходимости перерисовки посылают своему родительскому окну сообщение WM_DRAWITEM. Это происходит
при первоначальном создании кнопки,
при ее нажатии или отпускании,
при получении или потере фокуса ввода
и во всех других случаях, когда требуется перерисовка.
При обработке сообщения WM_DRAWITEM параметр lParam этого сообщения является указателем на структуру типа DRAWITEMSTRUCT:
case WM_DRAWITEM: { UINT idCtl = (UINT) wParam; DRAWITEMSTRUCT *lpdis = (LPDRAWITEMSTRUCT) lParam; // необходимо перерисовать окно с идентификатором idCtl . . . }; return 0l;
Слайд 29Кнопки, определяемые пользователем
Структура DRAWITEMSTRUCT содержит информацию, необходимую программе для рисования кнопки (такая
Кнопки, определяемые пользователем
Структура DRAWITEMSTRUCT содержит информацию, необходимую программе для рисования кнопки (такая
hDC - контекст устройства для кнопки,
rcItem - структура RECT с размерами кнопки,
CtlID - идентификатор окна управления,
itemState - показывает, нажата ли кнопка и имеет ли она фокус ввода. Если кнопка в момент сообщения нажимается, то в поле itemState устанавливается бит. Для выяснения, установлен ли бит, можно использовать константу ODS_SELECTED. Если кнопка имеет фокус ввода, тогда будет установлен бит ODS_FOCUS поля itemState.
Замечание. Необходимо заметить, что для отрисовки дочерней кнопки, определяемой пользователем, Windows сама получает контекст устройства кнопки и включает его в виде поля в структуру, передаваемую вместе с сообщением WM_DRAWITEM.
После использования этого контекста устройства программа должна оставить его в том же состоянии, в каком он ей передавался. Все объекты GDI, выбранные в контекст устройства, должны быть из него удалены.
Слайд 30Статическое дочернее окно управления
Статическое дочернее окно управления - это окно, создаваемое на
Статическое дочернее окно управления
Статическое дочернее окно управления - это окно, создаваемое на
Статические окна нельзя использовать для управления работой приложения: они не воспринимают щелчки мыши и не обрабатывают сообщения от клавиатуры, не посылает родительскому окну сообщение WM_COMMAND. Обычно этот орган управления используется для оформления внешнего вида диалоговых панелей или окон приложения.
Все сообщения от мыши через “прозрачное” окно статического дочернего окна попадают в родительское окно.
Для создания статического дочернего окна необходимо использовать функцию CreateWindow. В качестве первого параметра следует указать класс окна “static”, например:
static UINT ID_static=2; static HWND hWndStatic; . . . hWndStatic=CreateWindow("static",NULL, WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS| SS_GRAYRECT, x,y,width,height, hWndParent,(HMENU)ID_static,hInst,NULL);
Слайд 31Статическое дочернее окно управления
Рассмотрим стили статического дочернего окна
Первые шесть стилей – SS_BLACKRECT,
Статическое дочернее окно управления
Рассмотрим стили статического дочернего окна
Первые шесть стилей – SS_BLACKRECT,
Вставки “BLACK”, “GRAY”, “WHITE” не означают, что цветами являются соответственно черный, серый и белый. Эти цвета основаны на системных цветах: “BLACK” – COLOR_3DDKSHADOW, “GRAY” – COLOR_BTNSHADOW, “WHITE” – COLOR_BTNHIGHLIGHT.
Для создания рамки с тенью, состоящей из серого и белого цветов можно дополнительно воспользоваться стилями SS_ETCHEDHORZ, SS_ETCHEDVERT, SS_ETCHEDFRAME.
Статический класс окон также включает в себя три стиля текста – SS_LEFT, SS_RIGHT и SS_CENTER. Они предназначены для выравнивания текста соответственно по левому краю, правому краю и центру. Текст задается в параметре текста окна функции CreateWindow, и позднее может быть изменен функцией SetWindowText.
Фоном дочерних окон этих трех стилей обычно является COLOR_BTNFACE, а самого текста – COLOR_WINDOWTEXT.
Замечание. Кроме перечисленных стилей, статический класс содержит стили окна SS_ICON и SS_USERITEM. Однако статические окна таких стилей имеют смысл только при использовании их в окнах диалога.
Слайд 32Поля ввода
В Windows зарегистрирован класс окна с именем “edit”, на базе которого
Поля ввода
В Windows зарегистрирован класс окна с именем “edit”, на базе которого
Для того чтобы создать свой собственный редактор, достаточно создать на базе класса “edit” окно управления, вызвав функцию CreateWindow, например:
static UINT ID_edit=3; static HWND hWndEdit; . . . hWndEdit=CreateWindow("edit",NULL, WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS| WS_BORDER|ES_LEFT, x,y,width,height,hWnd,(HMENU)ID_edit,hInst,NULL);
По умолчанию в окне редактирования отсутствует рамка окна. Добавить ее можно, используя стиль WS_BORDER.
Для того чтобы после создания поместить в редактируемое поле текст, можно воспользоваться функцией SetWindowText. Для получения текста из окна редактирования используются функии GetWindowTextLength и GetWindowText.
Управляющие окна редактирования хранят текст в области памяти программы (в адресном пространстве программы). Содержимое управляющих полей редактирования ограничено примерно 32 килобайтами.
Слайд 33Поля ввода
Рассмотрим стили окон редактирования
Текст в управляющих окнах редактирования может быть выравнен
Поля ввода
Рассмотрим стили окон редактирования
Текст в управляющих окнах редактирования может быть выравнен
По умолчанию в управляющем окне редактирования имеется одна строка. Для создания такого окна с автоматической горизонтальной прокруткой следует добавить стиль ES_AUTOHSCROLL.
Приложение может создать многострочное управляющее окно редактирования, используя стиль окна ES_MULTILINE. Для многострочного окна редактирования, если не задан стиль ES_AUTOHSCROLL, то текст автоматически переносится на новую строку при достижении правого края окна.
При задании стиля ES_AUTOHSCROLL в многострочном редакторе для перехода на новую строку нужно нажимать клавише
Если стили ES_AUTOHSCROLL и ES_AUTOVSCROLL включены в многострочные управляющие окна, то можно добавить и сами полосы прокрутки.
Добавление полос прокрутки делается путем использования тех же идентификаторов стиля окна, что и для недочерних окон: WS_HSCROLL и WS_VSCROLL.
Чаще всего для многострочных редакторов используется следующая комбинация стилей:
WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_BORDER| ES_MULTILINE|ES_|ES_AUTOVSCROLL|WS_HSCROLL|WS_VSCROLL
Слайд 34Поля ввода
Рассмотрим, как окна редактирования уведомляют родительское окно о тех изменениях, которые
Поля ввода
Рассмотрим, как окна редактирования уведомляют родительское окно о тех изменениях, которые
Поля редактирования посылают оконной процедуре родительского окна сообщения WM_COMMAND. Значения параметров сообщения wParam и lParam такие же, как и для кнопок. Ниже представлены коды уведомления управляющих окон редактирования:
EN_SETFOCUS – окно получило фокус ввода.
EN_KILLFOCUS – окно потеряло фокус ввода.
EN_CHANGE – содержимое окна будет меняться.
EN_UPDATE – содержимое окна изменилось.
EN_ERRSPACE – произошло переполнение буфера редактирования.
EN_MAXTEXT – произошло переполнение буфера редактирования при вставке.
EN_HSCROLL – на горизонтальной полосе прокрутки был щелчок мышью.
EN_VSCROLL – на вертикальной полосе прокрутки был щелчок мышью.
Для обработки сообщения от поля редактирования оконная функция родительского окна может содержать код следующего вида:
case WM_COMMAND: { UINT idCtl=LOWORD(wParam); // идентификатор дочер. окна UINT code=HIWORD(wParam); // код уведомления HWND hChild=(HWND)lParam; // дескриптор дочер. окна if(idCtrl==ID_edit&&code==EN_CHANGE) { // текст поля сейчас будет меняться . . . } }; return 0;
Слайд 35Поля ввода
Родительские окна также могут посылать окнам редактирования сообщения
Специфических сообщений, которые родительское
Поля ввода
Родительские окна также могут посылать окнам редактирования сообщения
Специфических сообщений, которые родительское
WM_CUT - для удаления с пересылкой в буфер обмена;
WM_COPY - копирования в буфер обмена;
WM_CLEAR - очищения выделенной части текста из окна редактирования;
WM_PASTE - для вставки текста из буфера обмена в окно редактирования;
EM_GETSEL - для получения начальной и конечной позиции текущего выделения текста;
EM_SETSEL - для выделения некоторого участка текста;
EM_REPLACESEL - для замены текущего выделенного текста другим текстом;
EM_GETLINECOUNT - для получения число строк многострочного редактора;
EM_LINEINDEX - для получения смещения от начала буфера до некоторой строки;
EM_LINELENGTH - для получения длины некоторой строки;
EM_GETLINE - для копирования некоторой строки в буфер программы.
Слайд 36Элемент управления «Список»
С помощью класса “listbox” можно создавать одноколоночные и многоколоночные списки,
Элемент управления «Список»
С помощью класса “listbox” можно создавать одноколоночные и многоколоночные списки,
Список может быть как с одиночным выбором, так и с множественным. Последний позволяет пользователю выбирать более одного пункта списка
Для создания списка приложение должно вызвать функцию CreateWindow, передав ей в качестве первого параметра указатель на строку “listbox”, например:
static int ID_list=4; static HWND hWndList; . . . hWndList=CreateWindow("listbox",NULL, WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS| LBS_STANDARD, x,y,width,height,hWnd,(HMENU)ID_list,hInst,NULL); Окно списка посылает сообщение WM_COMMAND своему родительскому окну, когда в списке выбирается какой-либо пункт. Родительское окно может определить, какой пункт списка выбран.
Замечание. При необходимости родительское окно может создать список, внешний вид которого определяется пользователем, и само отрисовывать изображения элементов списка.
Слайд 37Элемент управления «Список»
Рассмотрим стили окон списков
При задаваемом по умолчанию стиле окна списка
Элемент управления «Список»
Рассмотрим стили окон списков
При задаваемом по умолчанию стиле окна списка
В окна списка почти всегда включают идентификатор стиля LBS_NOTIFY, что позволяет родительскому окну получать от окна списка сообщение WM_COMMAND.
Если приложение желает иметь возможность сортировать элементы списка, ему необходимо использовать в окне списке и другой часто используемый идентификатор стиля – LBS_SORT.
По умолчанию, в списке допускается выбор только одного пункта. Если необходимо создать список с возможностью выборки сразу нескольких пунктов, то следует использовать стиль LBS_MULTIPLESEL.
По умолчанию, оконная процедура окна списка выводит только список элементов без какой-либо рамки вокруг. Рамку можно добавить с помощью стиля WS_BORDER.
Для прокрутки содержимого с помощью мыши и вертикальной полосы прокрутки следует использовать стиль WS_VSCROLL.
Слайд 38Элемент управления «Список»
В заголовочных файлах Windows определяется стиль списка, который называется LBS_STANDARD.
Элемент управления «Список»
В заголовочных файлах Windows определяется стиль списка, который называется LBS_STANDARD.
(LBS_NOTIFY|LBS_SORT|WS_VSCROLL|WS_BORDER)
Замечание. Также можно пользоваться стилями WS_SIZEBOX и WS_CAPTION, которые дают возможность менять размер окна и перемещать его по рабочей области родительского окна.
Рассмотрим сообщения, которые могут посылать родительские окна окнам списков для их заполнения и дальнейшей работы с ними
После создания окна списка в него следует добавить строки текста – элементы списка. Это делается при помощи функции SendMessage посредством отправки сообщений окну списка. Ссылка на строку текста (на элемент) обычно осуществляется через индекс, который начинается с 0, что соответствует самому верхнему элементу списка.
Слайд 39Элемент управления «Список»
Специфических сообщений, которые родительское окно может послать окну списка при
Элемент управления «Список»
Специфических сообщений, которые родительское окно может послать окну списка при
LB_ADDSTRING - для добавления строки в конец списка или по алфавитному порядку (последнее - если используется стиль LBS_SORT);
LB_INSERTSTRING - для вставки строки на определенное порядковое место в списке (если не используется стиль LBS_SORT);
LB_DELETESTRING - для удаления строки с некоторым порядковым номером;
LB_RESETCONTENT - для полного очищения списка;
LB_GETCOUNT - для определения общего количества пунтов списка;
LB_GETTEXTLENGTH - для определения длины любого пункта списка;
LB_SETCURSEL - для установки элемента, выбираемого по умолчания (для списков с единичной выборкой);
LB_SELECTSTRING - для выборки (установки) элемента списка на основе его первых символов (для списков с единичной выборкой);
LB_GETCURSEL - для определения индекса элемента, выбранного в текущий момент (для списков с единичной выборкой);
LB_SETSEL - для установки состояния выбора конкретного элемента, при этом не оказывая влияния на другие элементы, которые могли бы быть выбранными(для списков с множественным выбором);
LB_GETSEL - для определения, выбран ли конкретный элемент списка или нет.
Слайд 40Элемент управления «Список»
Самым мощным сообщение для окон списка является сообщение LB_DIR. Следующий
Элемент управления «Список»
Самым мощным сообщение для окон списка является сообщение LB_DIR. Следующий
SendMessage(hWndList,LB_DIR, iAttr,(LPARAM)szFileSpec);
Параметр iAttr – это код атрибута файла, он определяет атрибуты отображаемых в списке файлов.
Параметр szFileSpec – это указатель на строку, задающую спецификацию файлов. Такая спецификация не влияет на подкаталоги, которые содержатся в списке.
Рассмотрим, какие значения, объединенные порязрядным ИЛИ, можно использовать для задания атрибутов файлов:
В качестве младшего байта используется обычный атрибут файла: DDL_READWRITE – обычный файл; DDL_READONLY – файл только для чтения, DDL_HIDDEN – скрытый файл; DDL_SYSTEM – системный файл; DDL_DIRECTORY – подкаталог; DDL_ARCHIVE – файл с установленным архивным битом.
Старший байт обеспечивает некоторый дополнительный контроль над выводимыми именами: DDL_DRIVES – включение имен дисков; DDL_EXCLUSIVE – включать только файлы с указаными атрибутам.
Слайд 41Элемент управления «Список»
Вот как будет, например, выглядеть вызов, выводящий в список имена
Элемент управления «Список»
Вот как будет, например, выглядеть вызов, выводящий в список имена
SendMessage(hWndList,LB_DIR, DDL_READWRITE|DDL_READONLY|DDL_HIDDEN| DDL_SYSTEM|DDL_DIRECTORY|DDL_DRIVES|DDL_ARCHIVE, (LPARAM)"*.*");
Если для списка не используется стиль LBS_SORT, то имена файлов и каталогов выводятся вперемешку, а имена доступных дисков оказываются в конце списка.
Замечание. Когда пользователь щелкает мышью над окном списка, окно списка получает фокус ввода. Если окно списка имеет фокус ввода, то для выбора пунктов можно пользоваться как мышью, так и клавиатурой.
Рассмотрим сообщения, которые могут посылать списки родительским окнам
Окно списка посылает родительскому окну сообщения WM_COMMAND, в старшем слове параметра wParam этого сообщения содержится код уведомления:
LBN_ERRSPACE - превышен размер памяти, отведенный для списка
LBN_SELCHANGE - изменен текущий выбор (подсветка перемещается по списку);
LBN_DBLCLK - на пункте списка имел место двойной щелчок мышью.
Замечание. Окно списка посылает коды уведомления LBN_SELCHANGE и LBN_DBLCLK только в том случае, если в стиль дочернего окна включен идентификатор LBS_NOTIFY.
Слайд 42Элемент управления «Список»
Для обработки сообщения от списка оконная функция родительского окна может
Элемент управления «Список»
Для обработки сообщения от списка оконная функция родительского окна может
case WM_COMMAND:
{ UINT idCtl=LOWORD(wParam); // идентификатор дочер. окна UINT code=HIWORD(wParam); // код уведомления
HWND hChild=(HWND)lParam; // дескриптор дочер. окна If(idCtrl==ID_listbox&&code==LB_SELCHANGE)
{ // текущий выбор в списке изменился . . .
}
}; return 0;
Слайд 43Выпадающий список
Этот класс является комбинацией списка и однострочного редактора, поэтому для комбинированного
Выпадающий список
Этот класс является комбинацией списка и однострочного редактора, поэтому для комбинированного
Для того чтобы создать список класса “combobox”, приложение должно вызвать функцию CreateWindow, передав ей в качестве первого параметра указатель на строку “combobox”. Второй параметр должен быть указан как NULL. Например:
static int ID_combo=5; static HWND hWndCombo; . . . hWndCombo=CreateWindow("combobox",NULL, WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS| CBS_DROPDOWNLIST, x,y,width,height,hWnd,(HMENU)ID_combo,hInst,NULL);
При создании списка “combobox” указываются специальные стили комбинированного списка, символические имена которых имеют префикс CBS_.
Слайд 44Выпадающий список
Рассмотрим базовые стили комбинированного списка
Среди всех стилей комбинированного списка можно выделить
Выпадающий список
Рассмотрим базовые стили комбинированного списка
Среди всех стилей комбинированного списка можно выделить
Стиль CBS_SIMPLE соответствует списку с окном редактирования (или, как его называют, окном выбора).
Если список имеет стиль CBS_DROPDOWN, в исходном состоянии он состоит из окна редактирования и расположенной справа пиктограммы со стрелкой (кнопкой, предназначенной для отображения списка). Если нажать на эту пиктограмму левой клавишей мыши, под окном редактирования появится список.
Стиль CBS_DROPDOWNLIST аналогичен стилю CBS_DROPDOWN, но окно редактирования можно использовать только для просмотра выделенной строки, а не для редактирования или ввода.
Рассмотрим сообщения от комбинированного списка, посылаемые родительскому окну
Комбинированные списки посылают оконной процедуре родительского окна сообщения WM_COMMAND. Значения параметров сообщения wParam и lParam такие же как и для кнопок. Коды извещения для комбинированного списка имеют символические имена с префиксом CBN_.
Слайд 45Выпадающий список
Для обработки сообщения от комбинированного списка оконная функция родительского окна может
Выпадающий список
Для обработки сообщения от комбинированного списка оконная функция родительского окна может
case WM_COMMAND: { UINT idCtl=LOWORD(wParam); // идентификатор дочер. окна UINT code=HIWORD(wParam); // код уведомления HWND hChild=(HWND)lParam; // дескриптор дочер. окна If(idCtrl==ID_combo&&code==CBN_SELCHANGE) { // сделан выбор в комбинированном списке . . . } }; return 0; Рассмотрим сообщения, посылаемые родительским окном комбинированным спискам
Для управления списком “combobox” используется набор сообщений, аналогичный набору сообщений для списка “listbox” и редактора текста “edit”. Функция SendMessage, посылающая сообщения списку, возвращает значение, которое зависит от выполняемой функции, или коды ошибок.
В файле windows.h определены сообщения, специально предназначенные для работы со списком “combobox”. Символические имена этих сообщений имеют префикс CB_.
Слайд 46Для обработки сообщения от комбинированного списка оконная функция родительского окна может содержать
Для обработки сообщения от комбинированного списка оконная функция родительского окна может содержать
case WM_COMMAND: { UINT idCtl=LOWORD(wParam); // идентификатор дочер. окна UINT code=HIWORD(wParam); // код уведомления HWND hChild=(HWND)lParam; // дескриптор дочер. окна If(idCtrl==ID_combo&&code==CBN_SELCHANGE) { // сделан выбор в комбинированном списке . . . } }; return 0; Рассмотрим сообщения, посылаемые родительским окном комбинированным спискам
Для управления списком “combobox” используется набор сообщений, аналогичный набору сообщений для списка “listbox” и редактора текста “edit”. Функция SendMessage, посылающая сообщения списку, возвращает значение, которое зависит от выполняемой функции, или коды ошибок.
В файле windows.h определены сообщения, специально предназначенные для работы со списком “combobox”. Символические имена этих сообщений имеют префикс CB_.
Слайд 47Полосы прокрутки
Для создания дочернего окна управления типа полоса прокрутки приложение должно вызвать
Полосы прокрутки
Для создания дочернего окна управления типа полоса прокрутки приложение должно вызвать
static int ID_scroll=6; static HWND hWndScroll; . . . hWndScroll=CreateWindow("scrollbar",NULL, WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS| SBS_VERT|, x,y,width,height,hWnd,(HMENU)ID_scroll,hInst,NULL); В отличие от других дочерних окон управления, посылающих родительскому окну сообщения, полосы прокрутки не посылают сообщения WM_COMMAND. Вместо этого они, также как и полосы прокрутки окна, посылают ему сообщения WM_VSCROLL и WM_HSCROLL.
При обработке сообщений полос прокрутки приложению с помощью параметра lParam может различать сообщения полос прокрутки окна и полос прокрутки – элементов управления. Для полос прокрутки окна lParam равен NULL, а для полос – элементов управления он является дескриптором этих полос прокрутки, другими словами дескриптором дочернего окна
Значения же старшего и младшего слов параметра wParam для полос прокрутки окна и для полос прокрутки – дочерних окон имеют одинаковый смысл.
Слайд 48Полосы прокрутки
Замечание. Полосы прокрутки – элементы управления можно сделать любого размера. Для
Полосы прокрутки
Замечание. Полосы прокрутки – элементы управления можно сделать любого размера. Для
вызов GetSystemMetrics(SM_CYHSCROLL) выдает высоту горизонтальной полосы прокрутки,
а вызов GetSystemMetrics(SM_CXVSCROLL) – ширину вертикальной полосы прокрутки.
Для полос прокрутки – элементов управления также можно установить диапазон и текущее положение с помощью тех же вызовов функция, что и для полос прокрутки окна:
SetScrollRange(hWndScroll,SB_CTL,iNewMin,iNewMax,bRedraw); Полосы прокрутки – элементы управления могут обрабатывать сообщения клавиатуры, но только в том случае, если они имеют фокус ввода. Если необходимо, чтобы полоса прокрутки управления получала фокус ввода, когда на полосе прокрутки происходит щелчок мыши, то следует включить идентификатор WS_TABSTOP в параметр стиля дочернего окна управления при вызове функции CreateWindow.
Слайд 49Полосы прокрутки
Приведем пример обработки сообщений от полосы прокрутки – дочернего окна управления.
Полосы прокрутки
Приведем пример обработки сообщений от полосы прокрутки – дочернего окна управления.
static int min_sb=1,max_sb=100,pos_sb=20; SetScrollRange(hWndScroll,SB_CTL,min_sb,max_sb,TRUE); SetScrollPos(hWndScroll,SB_CTL,pos_sb,TRUE); Рассмотрим фрагмент оконной функции, демонстрирующий возможную обработку действий пользователя с этой вертикальной линейкой прокрутки:
case WM_VSCROLL: { // произведенное действие int nScrollCode=(int)LOWORD(wParam); // текущая позиция short int nPos=(short int)HIWORD(wParam); // дескриптор полосы просмотра или NULL HWND hwndScrollBar=(HWND)lParam; int old_pos_sb=pos_sb; switch(nScrollCode) { case SB_PAGEDOWN: pos_sb+=10; break; case SB_PAGEUP: pos_sb-=10; break; case SB_LINEDOWN: pos_sb+=1; break; case SB_LINEUP: pos_sb-=1; break; case SB_THUMBPOSITION: pos_sb=nPos; break; case SB_THUMBTRACK: pos_sb=nPos; break; default: return 0l; } if(pos_sb
Слайд 50Дополнительные элементы
Для упрощения создания Windows-приложений с интерфейсом пользователя, соответствующим элегантному интерфейсу оболочки
Дополнительные элементы
Для упрощения создания Windows-приложений с интерфейсом пользователя, соответствующим элегантному интерфейсу оболочки
Элементы управления главного окна – элементы управления, обычно используемые в главном окне. Toolbar (панель инструментов) - Состоит из кнопок быстрого доступа. Tooltip (окно подсказки) - Обеспечивает пользователя быстрой подсказкой, отображая текст во всплывающем окне. Status bar (строка состояния) - Информационная строка, обычно размещаемая в нижней части окна приложения.
Составные диалоговые элементы управления - элементы управления из списков свойств и мастеров Property page (станица свойств) - Немодальное диалоговое окно, используемое как одна страница в списке свойств или мастере (wizards). Property sheet (набор страниц свойств) - Набор из множества окон страниц свойств. Элементы управления Windows Explorer - элементы управления для построения приложений, похожих на Windows Explorer. Tree view (дерево просмотра) - Отображает иерархически элементизированный список (левая панель окна программы Windows Explorer). List view (список просмотра) - Отображает список элементов, идентифицируемых битовым образом и текстовыми данными (правая панель окна программы Windows Explorer).
Слайд 51Дополнительные элементы
Другие элементы управления
Animation (анимационное изображение) - Проигрывает анимационную последовательность для индикации
Дополнительные элементы
Другие элементы управления Animation (анимационное изображение) - Проигрывает анимационную последовательность для индикации
Слайд 52Основы общих элементов управления
Каждый элемент управления общего пользования, за исключением списка изображений,
Основы общих элементов управления
Каждый элемент управления общего пользования, за исключением списка изображений,
Оба типа элементов управления строятся с помощью функции CreateWindow, настраиваются с использованием конкретных флагов стиля класса, управляются специфичными для данного класса сообщениями и приводятся к нужному состоянию с применением обычных API – вызовов, манипулирующих с окнами.
Оба типа элементов управления также посылают уведомляющие сообщения родительскому окну, информируя обо всех происходящих событиях.
Разница между элементами управления общего пользования и предопределенными элементами управления состоит в том, какие сообщения они посылают для уведомления. Предопределенные элементы управления посылают уведомляющие сообщения WM_COMMAND, в то время как элементы управления общего пользования (за некоторыми исключениями) посылают сообщения WM_NOTIFY.
Хотя при поверхностном взгляде механизмы передачи отличаются, идея, лежащая в основе этих уведомляющих сообщений, одна и та же: родительское окно может иметь возможность реагировать на все интересующие его события.
Слайд 53Основы общих элементов управления
Наиболее важно при работе с элементами управления обоих типов
Основы общих элементов управления
Наиболее важно при работе с элементами управления обоих типов
Фактически, только один элемент управления – усовершенствованный редактор – является расширенным окном редактирования, поддерживающим такой же базовый набор стилей управления, сообщений и уведомлений, как и оригинал – предопределенное окно редактирования (плюс некоторые новые возможности).
Так же как и при работе с предопределенными элементами управления, преимущества от использования элементов управления общего пользования состоят в том, что, считая каждый из этих элементов “черным ящиком”, разработчик получает множество возможностей с минимумом затрат с его стороны.
Ключевым моментом для работы с элементами управления общего пользования является понимание управления и конфигурирование набора конкретных средств таким образом, чтобы при минимальных затратах добиться нужного поведения и внешнего вида элемента управления. Узнав о возможностях, остается только добиться того, чтобы сделать элемент управления работающим на приложение.
Слайд 54Инициализация библиотек и элементов общего пользования
Различные описания, которые необходимы для использования элементов
Инициализация библиотек и элементов общего пользования
Различные описания, которые необходимы для использования элементов
#include
Файл comctl32.lib представляет собой библиотеку импорта элементов управления общего пользования (ее следует подключить на этапе компоновки приложения), а файл comctl32.dll - это динамически подключаемая библиотека, в которой содержатся шаблоны и процедуры элементов управления (она будет использоваться во время работы приложения).
Перед использованием какого-либо элемента управления общего пользования программа должна вызвать функцию InitCommonControls (как правило, это делается в самом начале функции WinMain приложения), которая регистрирует классы окон этих элементов, используя функцию RegisterClass.
InitCommonControls();
Функция InitCommonControls не имеет параметров и не возвращает никакого значения.
Слайд 55Инициализация библиотек и элементов общего пользования
Ввиду размера и сложности усовершенствованного редактора, он
Инициализация библиотек и элементов общего пользования
Ввиду размера и сложности усовершенствованного редактора, он
LoadLibrary(“riched32.dll”); Различные описания, которые необходимы для использования усовершенствованного редактора находятся в файле richedit.h, а связанные с OLE описания для него находятся в файле richole.h.
Слайд 56Создание элементов общего пользования
Создание элементов управления общего пользования
Наиболее общий путь создания окна
Создание элементов общего пользования
Создание элементов управления общего пользования
Наиболее общий путь создания окна
#define ID_TOOLBAR 1 . . . HWND hWndToolbar=CreateWindow(TOOLBARCLASSNAME,NULL, CCS_TOP|WS_CHILD|WS_VISIBLE|WS_BORDER|WS_CLIPSIBLINGS, 0,0,0,0,hWndParent,(HMENU)ID_TOOLBAR,hInstance,0);
Имя класса окна не задается в кавычках, поскольку это символическая константа, определение которой зависит от набора символов, выбранного при построении программы. Для набора символов ANSI символическая константа TOOLBARCLASSNAME заменяется строкой “ToolbarWindow32”; для набора символов UNICODE символ “L” ставится перед этим именем (L“ToolbarWindow32”) для создания UNICODE-строки. Все классы элементов управления общего пользования определяются этим способом.
Чаще всего элементы управления общего пользования создаются как дочерние окна, что определяется заданием флага WS_CHILD и установкой описателя родительского окна hWndParent.
Слайд 57Создание элементов общего пользования
Как показано в примере, дочерние окна часто создаются с
Создание элементов общего пользования
Как показано в примере, дочерние окна часто создаются с
Альтернативой вызову функции CreateWindow является вызов специализированной функции создания элемента управления, которая обычно выполняет некоторую стандартную инициализацию.
Примером специализированной функции создания элемента управления является функция CreateToobarEx, строящая панель инструментов, и добавляющие в нее кнопки.
В других случаях, таких как набор страниц свойств, имя класса недоступно, поэтому требуется вызов специализированной функции: PropertySheet строит набор страниц свойств, а CreatePropertySheetPage строит индивидуальные страницы свойств.
Список изображений строится вызовом функции ImageList_Create – специализированной функции, поскольку список изображений не является окном.
Слайд 58Создание элементов общего пользования
Приведем все имена классов элементов управления общего пользования и
Создание элементов общего пользования
Приведем все имена классов элементов управления общего пользования и
Элементы управления главного окна
Tool bar TOOLBARCLASSNAME CreateToolbarEx
Tool tip TOOLTIPS_CLASS Нет
Status bar STATUSCLASSNAME CreateStatusWindow
Составные диалоговые элементы управления
Property page Нет
CreatePropertySheetPage
Property sheet Нет PropertySheet
Элементы управления Windows Explorer
Tree view WC_TREEVIEW Нет
List view WC_LISTVIEW Нет
Другие элементы управления
Animation ANIMATE_CLASS Нет
Drag list “listbox” или L“listbox” MakeDragList
Header WC_HEADER Нет
Hot key HOTKEY_CLASS Нет
Image list Нет ImageList_Create
Progress bar PROGRESS_CLASS Нет
Rich edit “RichEdit” илиL”RichEdit” Нет
Tab WC_TABCONTROL Нет
Trackbar TRACKBAR_CLASS Нет
Up-Down UPDOWN_CLASS CreateUpDownControl
Слайд 59Посылка сообщений общим элементам управления
После создания окна общего элемента для управления его
Посылка сообщений общим элементам управления
После создания окна общего элемента для управления его
Альтернативой вызовам функции SendMessage является использование наборов макросов языка С, определенных в файле commctrl.h, которые получают специфичный для сообщения набор параметров, осуществляют необходимые преобразования, а затем вызывают функцию SendMessage. Возвращаемое значение также преобразуется к нужному типу, поскольку часто значение типа LRESULT, возвращаемое функцией SendMessage, не совпадает с ожидаемым типом возвращаемого значения.
Несмотря на то, что макросы очень удобны и полезны, заголовочные файлы Windows, к сожалению, включают определения лишь для половины элементов управления общего пользования: для анимационного изображения, заголовка списка просмотра, списка просмотра, набора страниц свойств, дерева просмотра и набора закладок для выбора.
Слайд 60Уведомляющие сообщения от общих элементов управления
Как и предопределенные элементы управления, общие элементы
Уведомляющие сообщения от общих элементов управления
Как и предопределенные элементы управления, общие элементы
В отличие от предопределенных элементов управления, которые посылают уведомления как сообщения WM_COMMAND, общие элементы управления обычно посылают уведомления как сообщения WM_NOTIFY. Таким образом, если добавить общий элемент управления к существующему уже коду приложения, то смешивания обработки уведомляющих сообщений от предопределенных элементов управления и общих элементов в программе не произойдет. Сообщения WM_NOTIFY также предотвращают путаницу с уведомляющими сообщениями от меню, которые тоже выражаются в виде сообщений WM_COMMAND.
Вместе с сообщением WM_NOTIFY через параметры сообщения приходит необходимая приложению информация. Через параметр wParam передается идентификатор элемента управления, пославшего это сообщение. Параметр lParam содержит указатель на структуру типа NMHDR, в которой содержатся код уведомления и другая дополнительная информация.
Слайд 61Уведомляющие сообщения от общих элементов управления
Приведем фрагмент программы, в котором демонстрируется последовательность
Уведомляющие сообщения от общих элементов управления
Приведем фрагмент программы, в котором демонстрируется последовательность
case WM_NOTIFY:
int idCommonCtrl=(int)wParam; // идентификатор элемента управления
LPNMHDR pNMH=(LPNMHDR)lParam; // указатель на структуру int iCode= pNMH->code; // код уведомления
HWND hWndFrom= pNMH->hwndFrom; // дескриптор элемента управления
if(idCommonCtrl== ID_TOOLBAR)
{ // обработка сообщения от элемента управления // с идентификатором ID_TOOLBAR . . . } return 0l;
Однако не все уведомления общих элементов приходят как сообщения WM_NOTIFY.
В частности, панель инструментов, использующая сообщения WM_NOTIFY для большинства уведомлений, посылает сообщения WM_COMMAND, когда нажимается кнопка. Поскольку панель инструментов обычно используется для поддержки выбора из меню, тот же код обработки сообщений WM_COMMAND, что для поддержки меню и быстрых клавиш, будет обрабатывать сообщения от панели инструментов.
И еще одно исключение – «полоса прокрутки» Track bar, связанная с окном редактирования для изменения значения, которая также посылает сообщения WM_VSCROOL и WM_HSCROLL при нажатии на стрелки.