Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Оконная функция диалога






 

О всех событиях, происходящих в диалоге, передаются сообщения в функцию, связанную с этим диалогом (а не в функцию главного окна). Приведенная ниже функция диалога обрабатывает сообщения, связанные с диалогом 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().

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.