Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Оконная функция диалога
О всех событиях, происходящих в диалоге, передаются сообщения в функцию, связанную с этим диалогом (а не в функцию главного окна). Приведенная ниже функция диалога обрабатывает сообщения, связанные с диалогом MYDB:
// Простая функция диалога BOOL CALLBACK DialogFunc (HWND hdwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch(message) { case WM_COMMAND: switch(LOWORD(wParam)) { case IDCANCEL: EndDialog(hdwnd, 0); return 1; case IDD_RED: MessageBox(hdwnd, " Выбран Красный", " Красный", МВ_ОК); return 1; case IDD_GREEN: MessageBox(hdwnd, " Выбран Зеленый", " Зеленый", МВ_ОК); return 1; } } return 0; }
Каждый раз при воздействии на элемент управления диалога в функцию DialogFunc() поступает сообщение WM_COMMAND, в котором LOWORD(wParam) содержит идентификатор этого элемента управления. Функция DialogFunc() обрабатывает три командных сообщения, которые могут генерироваться в нашем диалоге. При нажатии кнопки Сброс сообщение содержит идентификатор IDCANCEL, и диалог завершится посредством вызова функции API EndDialog(). Идентификатор IDCANCEL является стандартным идентификатором, определенным в Windows.h. Функция EndDialog() имеет следующий прототип: BOOL EndDialog(HWND hwnd, int nStatus);
Параметр hwnd является дескриптором окна диалога, a nStatus содержит значение, возвращаемое функцией DialogBox(). Это значение может игнорироваться, если программа его не использует. Функция EndDialog() возвращает ненулевое значение при успешном завершении и нулевое в противном случае. Обычно эта функция завершается успешно. Нажатие двух других кнопок вызывает появление окна сообщения, подтверждающего нажатие соответствующей кнопки.
Пример 5-1. Ниже приводится полный текст программы с описанием диалога. В начале выполнения профаммы открывается окно, содержащее меню. При выборе команды Диалог 1 открывается диалог. После этого нажатие кнопок в диалоге вызывает соответствующую реакцию. Это отражено на рис. 5.1.
// Демонстрация модального диалога
#include < Windows.h> #include < String.h> #include < Stdio.h> #include " Mydialog.h"
LRESULT CALLBACK WindowFunc(HWND, UINT, WPARAM, LPARAM); BOOL CALLBACK DialogFunc(HWND, UINT, WPARAM, LPARAM);
char szWinName[] = " МоеОкно"; // Имя класса окна HINSTANCE hInst;
int WINAPI WinMain(HINSTANCE hThisInst, HINSTANCE hPrevInst, LPSTR lpszArgs, int nWinMode) { HWND hwnd; MSG msg; WNDCLASS wcl; HACCEL hAccel; // Определение класса окна: wcl.hInstance=hThisInst; // Дескриптор приложения wcl.lpszClassName=szWinName; // Имя класса окна wcl.lpfnWndProc=WindowFunc; // Функция окна wcl.style=0; // Стиль по умолчанию wcl.hIcon=LoadIcon(NULL, IDI_APPLICATION); // Иконка wcl.hCursor=LoadCursor(NULL, IDC_ARROW); // Курсор wcl.lpszMenuName=" MYMENU"; // Меню wcl.cbClsExtra=0; // Без дополнительной wcl.cbWndExtra= 0; // информации // Определить заполнение окна белым цветом wcl.hbrBackground= (HBRUSH)GetStockObject(WHITE_BRUSH); // Зарегистрировать класс окна if(! RegisterClass(& wcl)) return 0; // Создать окно hwnd=CreateWindow(szWinName, // Имя класса " Диалоги", // Заголовок WS_OVERLAPPEDWINDOW, // Стиль CW_USEDEFAULT, // Х-координата CW_USEDEFAULT, // Y-координата CW_USEDEFAULT, // Ширина CW_USEDEFAULT, // Высота HWND_DESKTOP, // Нет родит. окна NULL, // Нет меню hThisInst, // Дескрип. приложения NULL); // Без дополн. аргументов
hInst=hThisInst; // Сохранить дескриптор приложения // Загрузить акселераторы: hAccel=LoadAccelerators(hThisInst, " MYMENU"); // Показать окно и перерисовать содержимое: ShowWindow(hwnd, nWinMode); UpdateWindow(hwnd); // Запустить цикл обработки сообщений: while(GetMessage(& msg, NULL, 0, 0)) { if(! TranslateAccelerator(hwnd, hAccel, & msg)) { TranslateMessage(& msg); // Использ. клавиатуру DispatchMessage (& msg); // Вернуться к Windows } } return msg.wParam; }
// Следующая функция вызывается операционной системой // Windows и получает в качестве параметров сообщения // из очереди сообщений данного приложения
LRESULT CALLBACK WindowFunc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch(message) { case WM_COMMAND: // Обработка команд switch(LOWORD(wParam)) { case IDM_DIALOG1: DialogBox(hInst, " MYDB", hwnd, DialogFunc); break; case IDM_DIALOG2: MessageBox(hwnd, " Этого диалога пока нет", " ", MB_OK); break; case IDM_HELP: MessageBox(hwnd, " Помощь", " Помощь", MB_OK); break; } break; case WM_DESTROY: // Завершение программы PostQuitMessage(0); break; default: // Все сообщения, не обрабатываемые в данной // функции, направляются на обработку по // умолчанию return DefWindowProc(hwnd, message, wParam, lParam); } return 0; }
// Простая функция диалога
BOOL CALLBACK DialogFunc (HWND hdwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch(message) { case WM_COMMAND: // Обр-ка командных сообщений switch(LOWORD(wParam)) { case IDCANCEL: EndDialog(hdwnd, 0); return 1; case IDD_RED: MessageBox(hdwnd, " Выбран Красный", " Красный", MB_OK); return 1; case IDD_GREEN: MessageBox(hdwnd, " Выбран Зеленый", " Зеленый", MB_OK); return 1; } } return 0; }
Рис. 5.1. Результаты работы программы с диалогом
Обратите внимание на внешнюю переменную hInst. Эта переменная содержит дескриптор текущего экземпляра приложения. Ее существование обусловлено тем, что при создании диалога требуется дескриптор приложения. Поскольку диалог создается не в WinMain(), а в WindowFunc(), необходима копия дескриптора приложения, доступная извне WinMain().
|