Московский инженерно-физический институт
Вид материала | Практикум |
Содержание4. Ресурсы: диалоговые окна Простая программа с меню и диалогом Menuitem separator "Static", ss_center, 12, 4, 72, 25 |
- Ю. С. Барсуков 1, А. Ю. Окунев 2 1 Московский инженерно-физический институт (государственный, 29.25kb.
- В. А. Курнаев Московский инженерно-физический институт (государственный университет),, 27.18kb.
- «Вегето-сосудистая дистония», 192.12kb.
- Перечен ь научных разделов и базовых вузов по научным разделам открытого конкурса, 247.02kb.
- Д. В. Гуцко Московский инженерно-физический институт (государственный университет), 34.47kb.
- В. А. Тумольский московский инженерно-физический институт (государственный университет), 27.44kb.
- К. С. Чистов Московский инженерно-физический институт (государственный университет), 24.11kb.
- Вдокладе рассматривается задача оценки рисков инвестиционных проектов электростанций, 29.4kb.
- Резюме Луценко Владимир Юрьевич, 22.32kb.
- Л. Ю. Грецкая московский инженерно-физический институт (государственный университет), 26.28kb.
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);//Закрыть диалог
}
}