Цель и задачи работы, требования к результатам ее выполнения Цель работы состоит в изучении основных API (Application Programming Interface) функций для работы с диалоговыми окнами и элементами управления и в овладении навыками разработки программ на языке Си++ с использованием диалоговых окон и элементов управления. Для достижения цели необходимо выполнить следующие задачи:
- изучить необходимые учебные материалы, посвященные использованию диалоговых окон и элементов управления в языке Си++ с помощью API- функций Windows [1, 3, 4];
- разработать программу на языке Си++ для решения заданного варианта задания;
- отладить программы;
- представить скриншот окна с результатами работы программы;
- подготовить отчет по лабораторной работе.
Краткая характеристика объекта изучения
Классификация диалоговых окон
Диалоговые окна можно классифицировать по следующим признакам:
1) Признак модальности:
- модальные (блокируют работу пользователя с родительским окном до тех пор, пока пользователь модальное диалоговое окно не закроет);
- немодальные (не блокируют работу пользователя с родительским окном).
2) По назначение:
- окна сообщений;
- стандартные (выбор файла, выбор цвета, выбор шрифта и др.);
- специальные (создаются программистом для решения своих задач).
Окна сообщений
Функция для создания окна сообщений может иметь заголовок:
int MessageBoxA(HWND hWnd , // Хэндл родительского окна
LPCSTR lpText, // Текст в окне
LPCSTR lpCaption, // Заголовок
UINT uType); // Тип окна (наличие кнопок и иконка)
Возможные значения параметра uType задаются константами:
MB_OK
MB_OKCANCEL
MB_ABORTRETRYIGNORE
MB_YESNOCANCEL
MB_YESNO
MB_RETRYCANCEL
MB_ICONHAND
MB_ICONQUESTION
MB_ICONEXCLAMATION
MB_ICONASTERISK
Константы, задающие наличие кнопок и вид иконки (MB_ICON…), можно использовать совместно с помощью поразрядной операции «ИЛИ» ( | ).
Возвращаемое значение зависит от того, какая кнопка нажата для закрытия окна. Возможные значения:
IDOK
IDCANCEL
IDABORT
IDRETRY
IDIGNORE
IDYES
IDNO
Создание модального диалогового окна
Удобнее всего диалоговое окно вместе со своими элементами управления описывать в файле ресурсов. В этом случае функция для создания окна имеет заголовок:
DialogBox(hInstance, //Хэндл приложения
lpTemplate, //Строка-название ресурса окна
hWndParent, //Хэндл родительского окна
lpDialogFunc); //Указатель на функцию окна
Функция для закрытия окна:
BOOL EndDialog(HWND hDlg, // Хэндл закрываемого окна
int nResult); // Значение, которые вернет DialogBox при выходе
Для инициализации диалогового окна (задания начального состояния элементов управления, присвоения значений переменным и др.) необходимо обработать сообщение WM_INITDIALOG.
Ниже показан пример функции окна для диалогового окна, имеющего две стандартных кнопки Ok и Cancel.
BOOL CALLBACK DialogFun(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_INITDIALOG:
return TRUE;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDOK:
case IDCANCEL:
EndDialog(hwnd, LOWORD(wParam));
return TRUE;
}
}
return FALSE;
}
Пример создания этого диалогового окна, определенного в файле ресурсов с идентификатором IDD_DIALOG1:
if (DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), 0, DialogFun)==IDOK)
MessageBox(0, "Нажата Ok", "Сообщение", MB_OK);
else
MessageBox(0, "Нажата Cancel", "Сообщение", MB_OK);
Элементы управления диалогового окна
Основные:
– кнопка, контрольный переключатель, радиокнопка, текстовое поле, список,…
Общие или дополнительные (требуется подключение специальной библиотеки):
– строка состояния, спин, регулятор, индикатор процесса, ...
Большинство элементов управления является разновидностями окон. Функция для получения хэндла элемента управления имеет заголовок:
HWND GetDlgItem(HWND hDlg, //Хэндл род. окна
int nIDDlgItem); //Идентификатор элемента управления
Функции для посылки сообщений элементам управления имеют заголовки:
LRESULT SendDlgItemMessage( HWND hDlg, // Хэндл диалогового окна
int nIDDlgItem, // Идентификатор элемента управления
UINT Msg, // Тип сообщения
WPARAM wParam, LPARAM lParam); // Параметры сообщения
LRESULT SendMessage(HWND hWnd, // Хэндл элемента управления
UINT Msg, // Тип сообщения
WPARAM wParam, LPARAM lParam); // Параметры сообщения
Рассмотрим некоторые элементы, которые необходимо использовать при выполнении лабораторной работы.
Кнопка, контрольный переключатель, радио кнопка
Сообщение, приходящее от элементов управления WM_COMMAND.
Младшее слово wParam содержит значение идентификатора элемента управления. Старшее слово wParam определяет действия с кнопкой (нотификационные сообщения), некоторые возможные значения:
BN_CLICKED // «Нажатие» на элемент
BN_PAINT // Перерисовка элемента
BN_DOUBLECLICKED // Двойной щелчок
BN_SETFOCUS // Элемент получил фокус ввода с клавиатуры
BN_KILLFOCUS // Элемент потерял фокус ввода с клавиатуры
Сообщения, которые можно посылать элементам:
BM_GETCHECK BM_SETCHECK BM_GETSTATE BM_SETSTATE BM_SETSTYLE BM_CLICK BM_GETIMAGE BM_SETIMAGE
Текстовое поле
Сообщение от текстового поля, аналогичное как для кнопок- WM_COMMAND.
Некоторые нотификационные сообщения от текстового поля (старшее слово wParam):
EN_SETFOCUS // Элемент получил фокус ввода с клавиатуры
EN_KILLFOCUS // Элемент потерял фокус ввода с клавиатуры
EN_CHANGE // Текст в текстовом поле изменен
Основные сообщения, которые можно посылать текстовым полям:
WM_SETTEXT // Поместить текст в текстовое поле
WM_GETTEXT // Извлечь текст из текстового поля
Примеры
Поместить текст в текстовое поле:
SendDlgItemMessage(hwnd, IDC_EDIT1, WM_SETTEXT, 0, (LPARAM)Text);
Получить текст из текстового поля:
SendDlgItemMessage(hwnd, IDC_EDIT2, WM_GETTEXT, 255, (LPARAM)Text);
До этого где- то объявлен массив символов, в котором текст хранится как строка: char Text[256];
Список
Элементами списка являются строки. Индексация элементов начинается с нуля. Сообщение от списка такое же, как для рассмотренных выше элементов- WM_COMMAND.
Коды некоторых нотификационных сообщений, приходящих от списка (старшее слово wParam):
LBN_SELCHANGE // Выбор элемента изменен
LBN_DBLCLK // Двойной щелчок на элементе списка
LBN_SETFOCUS // Элемент получил фокус ввода с клавиатуры
LBN_KILLFOCUS // Элемент потерял фокус ввода с клавиатуры
Коды некоторых сообщений, посылаемых списку:
LB_ADDSTRING // Добавить строку в список
LB_INSERTSTRING // Вставить строку в список
LB_DELETESTRING // Удалить элемент из списка
LB_SETCURSEL // Установить выбор заданного элемента
LB_GETCURSEL // Получить индекс выбранного элемента
LB_GETTEXT // Получить текст из элемента
LB_GETCOUNT // Получить число элементов списка
LB_RESETCONTENT // Очистить список
Примеры посылки сообщений списку
Добавить строку текста в список:
SendDlgItemMessage(hwnd, IDC_LIST1, LB_ADDSTRING, 0, (LPARAM)Text);
Получить индекс выделенного элемента:
int i=SendDlgItemMessage(hwnd, IDC_LIST1, LB_GETCURSEL, 0, 0);
Извлечь строку из элемента с индексом i:
SendDlgItemMessage(hwnd, IDC_LIST1, LB_GETTEXT, i, (LPARAM)Text);
Удалить элемент с индексом i:
SendDlgItemMessage(hwnd, IDC_LIST1, LB_DELETESTRING, i, 0);
Очистить список:
SendDlgItemMessage(hwnd, IDC_LIST1, LB_RESETCONTENT, 0, 0);
|