Московский инженерно-физический институт

Вид материалаПрактикум

Содержание


4. Ресурсы: диалоговые окна
Простая программа с меню и диалогом
Menuitem separator
"Static", ss_center, 12, 4, 72, 25
Подобный материал:
1   ...   10   11   12   13   14   15   16   17   ...   24

4. Ресурсы: диалоговые окна


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

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

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

Рассмотрим сначала типичную организацию “полноценного” приложения с главным окном, меню и диалогом в качестве внутреннего элемента.

Простая программа с меню и диалогом


В приводимой ниже программе 4-1 предусмотрена линейка меню с единственным пунктом "Файл". При щелчке по нему левой клавишей мыши открывается меню из двух пунктов: "О программе..." и "Выход". Щелчок мышью по первому пункту приводит к выводу на экран диалогового окна с информацией об авторе программы и с единственной кнопкой "Закрыть", щелчок по которой закрывает диалоговое окно. Выбор пункта меню "Выход" завершает все приложение.

Вид главного окна приложения с развернутым меню и открытым диалогом приведен на рис. 4.1.



Рис. 4.1. Программа с меню и модальным диалогом

Приложение 4-1 (как и предыдущее приложение с меню) включает в себя три файла: заголовочный файл 4-1.H, файл ресурсов
4-1.RC и файл с исходным текстом программы 4-1.CPP.

/*Пример 4-1. Программа с меню и модальным диалогом*/

/*Файл 4-1.H*/

/*Определения констант*/

#define MI_ABOUT 100

#define MI_EXIT 101

#define ID_OK 100

/*Прототипы функций для главного окна*/

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

void OnCommand(HWND,int,HWND,UINT);

void OnDestroy(HWND);

/*Прототипы функций для окна диалога*/

BOOL CALLBACK DlgProc(HWND,UINT,WPARAM,LPARAM);

BOOL DlgOnInitDialog(HWND,HWND,LPARAM);

void DlgOnCommand(HWND,int,HWND,UINT);

/*Файл 4-1.RC*/

#include "4-1.h"

Main MENU {

POPUP "Файл" {

MENUITEM "О программе...",MI_ABOUT

MENUITEM SEPARATOR

MENUITEM "Выход",MI_EXIT

}

}

About DIALOG 65, 5, 93, 50

STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU

CAPTION "О программе" {

CONTROL "Закрыть",ID_OK,"BUTTON",BS_PUSHBUTTON,

27, 32, 43, 12

CONTROL "Автор программы\nИванов И.И.\n2005", -1,

"STATIC", SS_CENTER, 12, 4, 72, 25

}

/*Файл 4-1.CPP*/

#include

#include

#include "4-1.h"

HINSTANCE hIn;//Глобальная переменная

/*Главная функция WinMain*/

int WINAPI WinMain(HINSTANCE hInst,HINSTANCE,LPSTR,int){

char szClassName[]="MainWindow";

char szTitle[]="Программа 4-1";

MSG msg;

WNDCLASS wc;

hIn=hInst;//Сохраним дескриптор приложения

/*Зарегистрируем класс главного окна*/

memset(&wc,0,sizeof(wc));

wc.lpfnWndProc=WndProc;

wc.hInstance=hInst;

wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);

wc.hCursor=LoadCursor(NULL,IDC_ARROW);

wc.hbrBackground=GetStockBrush(WHITE_BRUSH);

wc.lpszMenuName="Main";//Имя меню в файле ресурсов

wc.lpszClassName=szClassName;

RegisterClass(&wc);

/*Создадим главное окно и сделаем его видимым*/

HWND hwnd=CreateWindow(szClassName,szTitle,

WS_OVERLAPPEDWINDOW,10,10,350,200,

HWND_DESKTOP,NULL,hInst,NULL);

ShowWindow(hwnd,SW_SHOWNORMAL);

/*Организуем цикл обработки сообщений*/

while(GetMessage(&msg,NULL,0,0))

DispatchMessage(&msg);

return 0;

}

/*Оконная функция WndProc главного окна*/

LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,

WPARAM wParam,LPARAM lParam){

switch(msg){

HANDLE_MSG(hwnd,WM_COMMAND,OnCommand);

HANDLE_MSG(hwnd,WM_DESTROY,OnDestroy);

default:

return(DefWindowProc(hwnd,msg,wParam,lParam));

}

}

/*Функция OnCommand обработки сообщений WM_COMMAND

void OnCommand(HWND hwnd,int id,HWND,UINT){

switch(id){//id = идентификатор выбранного пункта меню

case MI_ABOUT://Открыть диалог

DialogBox(hIn,"About",hwnd,DlgProc);

break;

case MI_EXIT://Завершить приложение

DestroyWindow(hwnd);

}

}

/*Функция OnDestroy обработки сообщения WM_DESTROY*/

void OnDestroy(HWND){

PostQuitMessage(0);

}

/*Оконная функция AboutProc диалогового окна*/

BOOL CALLBACK DlgProc(HWND hwnd,UINT msg,

WPARAM wParam,LPARAM lParam){

switch(msg) {

HANDLE_MSG(hwnd,WM_INITDIALOG,DlgOnInitDialog);

HANDLE_MSG(hwnd,WM_COMMAND,DlgOnCommand);

default:

return FALSE;

}

}

/*Функция DlgOnInitDialog обработки сообщения WM_INITDIALOG

BOOL DlgOnInitDialog(HWND,HWND,LPARAM){

return TRUE;

}

/*Функция DlgOnCommand обработки сообщений WM_COMMAND

void DlgOnCommand(HWND hwnd,int id,HWND,UINT){

switch(id){//Код элемента управления (кнопки)

case ID_OK://Нажата кнопка "Закрыть"

case IDCANCEL://Закрытие диалога через его системное меню

EndDialog(hwnd,0);//Закрыть диалог

}

}