Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Обучение VC++ / ЛекцииИнтернетС++ / Лекция_лаб_практикум.doc
Скачиваний:
64
Добавлен:
16.02.2016
Размер:
932.35 Кб
Скачать

Домашняя работа.

Усовершенствовать программу таким образом, чтобы при перерисовке экрана фигуры не пропадали.

Лекция 4. Диалоговые окна и стандартные элементы управления Методические рекомендации

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

Так как немодальные окна чаще используются чем модальные, то необходимо добиться полного понимания студентами процесса работы с немодальными диалоговыми окнами.

Для лучшего понимания работы с диалоговыми окнами и разницы между модальными и немодальными диалоговыми окнами рекомендуется пользоваться примерами. Очень хорошо для этих целей подходит программа из пакета Microsoft Office – Microsoft Word. Примером модального диалогового окна может служить окно “открытия файла”, а примером немодального окна – “найти и заменить”.

План

  1. Модальные и немодальные диалоговые окна

  2. Работа с модальным диалоговым окном

  3. Стандартные элементы управления

  4. Работа с немодальными диалоговыми окнами

  5. Модальные и немодальные диалоговые окна

Практически все Windows – программы взаимодействуют с пользователем при помощи диалоговых окон. Диалоговое окно может просто содержать какое-то сообщение и кнопку Ok, а может быть и очень сложной формой для ввода данных.

Существует два типа диалоговых окон:

Модальные(modal). Пока открыто модальное диалоговое окно, пользователь не может работать ни с каким другим окном программы. Например, Open File – “Открытие файла”.

Немодальные(modeless). Пока открыто немодальное диалоговое окно, работать с другими окнами программы можно. Например, Find and Replace – “Найти и заменить” редактора Microsoft Word.

Работа с модальным диалоговым окном

Для того, чтобы добавить в ваше приложение модальное диалоговое окно необходимо выполнить следующие действия:

Используя редактор диалоговых окон, создать диалоговый ресурс с элементами управления.

С помощью ClassWizard создать класс “диалоговое окно”, производный от CDialog, и связать его с ресурсом созданным в п.1.

Используя ClassWizard, добавить в класс диалогового окна переменные члены и функции, предназначенные для обмена и проверки данных.

С помощью ClassWizrd добавить обработчики сообщений для кнопок и других, генерирующих события, элементов управления диалогового окна.

Написать код для инициализации (в функции OnInitDialog) элементов управления и для обработчиков сообщений.

Добавить код, активизирующий диалоговое окно. Он сводится к вызову конструктора вашего класса диалогового окна и последующему вызову функции – члена DoModal().

Стандартные элементы управления

Элемент управления “индикатор продвижения”

Индикатор продвижения – один из самых простых в программировании стандартный элемент управления; его представляет MFC класс CProgressCtrl.

Для инициализации индикатора продвижения необходимо вызвать (обычно это делается в функции OnInitDialog) функции-члены SetRange и SetPos. После этого, при необходимости, нужно вызывать функцию SetPos из обработчиков сообщений.

Элемент управления “ползунок”

Ползунок (класс CSliderCtrl) позволяет вводить аналоговые значения. Программным путем можно создать шкалу, деления которой соответствуют шагу приращения. Текущее положение ползунка возвращает функция – член GetPos.

Элемент управления “наборный счетчик”

Наборный счетчик (класс CSpinButtonCtrl) – это вариант полосы прокрутки, который часто используется совместно с полем ввода. Суть работы данного элемента в том, что пользователь, поместив курсор на счетчик и удерживая левую клавишу мыши, может увеличивать или уменьшать значение в поле ввода. Скорость работы тем выше, чем дольше удерживается клавиша мыши.

Если приложение оперирует в поле ввода только целыми числами, можно полностью обойтись без программирования на C++. Для того чтобы изменить диапазон и схему ускорения набора значений можно воспользоваться функциями-членами SetRange и SetAccel.

Для того чтобы поле ввода отображало нецелые значения, необходимо создать обработчик сообщения WM_VSCROLL (или WM_HSCROLL) от наборного счетчика. В обработчике необходимо осуществлять преобразования целых значений поступающих от счетчика в значения отображаемые в поле ввода.

Элемент управления “графический список”

Элемент управления “графический список” (класс CListCtrl) необходим для создания списка способного отображать не только текст но и графику. Когда пользователь выбирает какой–нибудь элемент, посылается уведомляющее сообщение, которое нужно обработать в классе “диалогового окна”. Элементы идентифицируются целочисленными индексами, начиная с 0.

Элемент управления “древовидный список”

Элемент управления “древовидный список” (класс CTreeCtrl) позволяет легко добавить в программу возможности аналогичные графическим возможностям отображения информации Microsoft Windows Explorer (Проводника).

Графический и древовидный списки имеют некоторые общие черты: они могут работать с одним и тем же списком изображений и совместно использовать одни и те же уведомляющие сообщения. Однако методы идентификации элементов у них разные. В древовидном списке вместо целочисленных индексов применяют описатель HTREEITEM.

Для того чтобы вставить новый элемент необходимо обратиться к функции-члену InsertItem, но перед этим нужно сформировать структуру TV_INSERTSTRUCT, которая идентифицирует строку, индекс в списке изображений и описатель родительского элемента (NULL для элементов верхнего уровня).

Примечание

И графический и древовидный списки получают выводимые ими картинки от стандартного элемента управления – список изображений (класс CImageList). В программе необходимо сначала сформировать список изображений из значков или растровых изображений, а затем передать элементу управления “графический список” или “древовидный список” указатель на этот список. Формировать список лучше всего в функции OnInitDialog.

Добавление элементов управления в период выполнения

Если необходимо добавить элемент управления в период выполнения программы нужно выполнить следующие действия:

Добавить в класс “диалоговое окно” переменную-член для внедряемого элемента управления. MFC-классы таких элементов управления включают CButton, CEdit, CListBox, CComboBox и т.д. Внедряемые C++ объекты конструируются и уничтожаются вместе с объектом “диалоговое окно”.

Выбрать из меню View среды Visual C++ команду Resource Symbols. Добавить константу идентификатор нового элемента управления.

Вызвать функцию-член Create внедряемого элемента управления в том месте программы, где должен создаваться новый элемент управления (обычно это обработчик сообщения WM_INITDIALOG – функция OnInitDialog).

Добавить вручную в производный класс диалогового окна обработчики уведомляющих сообщений, необходимые новому элементу управления.

Сообщение WM_NOTIFY

Раньше элементы управления Windows посылали свои уведомления в сообщениях WM_COMMAND. Однако стандартных 32-х разрядных параметров wParam и lParam недостаточно для передачи всей информации от стандартных элементов управления их объектам-родителям. Корпорация Microsoft решила проблему “пропускной способности”, введя новое сообщение WM_NOTIFY. При отправке такого сообщения wParam содержит идентификатор элемента управления, а lParam служит указателем на структуру NMHDR, модифицируемую данным элементом управления. Эта структура определяется на C++ следующим образом:

typedef struct tagNMHDR {

HWND hwndFrom; // описатель элемента управления, отправляющего сообщение

UINT idFrom; // идентификатор этого элемента

UINT code; // специфичный для этого элемента код уведомления

}NMHDR;

Однако многие элементы управления посылают сообщения WM_NOTIFY с указателями на структуры более крупные, чем NMHDR. Эти структуры содержат не только показанные выше три поля данных, но и дополнительные поля, специфичные для конкретного элемента управления. Например, во многих уведомлениях от древовидных списков передается указатель на структуру NM_TREEVIEW, содержащую структуру TV_ITEM и другие данные. Поэтому сопоставив обработчику сообщение WM_NOTIFY, ClassWizard генерирует указатель на соответствующую структуру.