Московский инженерно-физический институт
Вид материала | Практикум |
СодержаниеМодальный диалог как главное окно приложения Control "", id_1,"static", ss_left, 8, 8, 108, 10 |
- Ю. С. Барсуков 1, А. Ю. Окунев 2 1 Московский инженерно-физический институт (государственный, 29.25kb.
- В. А. Курнаев Московский инженерно-физический институт (государственный университет),, 27.18kb.
- «Вегето-сосудистая дистония», 192.12kb.
- Перечен ь научных разделов и базовых вузов по научным разделам открытого конкурса, 247.02kb.
- Д. В. Гуцко Московский инженерно-физический институт (государственный университет), 34.47kb.
- В. А. Тумольский московский инженерно-физический институт (государственный университет), 27.44kb.
- К. С. Чистов Московский инженерно-физический институт (государственный университет), 24.11kb.
- Вдокладе рассматривается задача оценки рисков инвестиционных проектов электростанций, 29.4kb.
- Резюме Луценко Владимир Юрьевич, 22.32kb.
- Л. Ю. Грецкая московский инженерно-физический институт (государственный университет), 26.28kb.
Модальный диалог как главное окно приложения
Использование разнообразных элементов управления позволяет формировать весьма сложные по структуре диалоговые окна, содержащие как средства ввода в программу требуемой числовой или символьной информации, так и средства вывода результатов ее работы. Многие прикладные задачи, в частности, носящие вычислительный характер, вполне удовлетворительно решаются с помощью программ, построенных на основе модального диалога (без главного окна). К приложениям с главным окном приходится прибегать, главным образом, в тех случаях, когда на экран требуется выводить рисунки (например, схемы процессов или установок) или графики. Если же результаты работы программы допустимо представлять в числовой форме, проще и удобнее использовать приложение на базе модального диалога.
Рассмотрим в качестве примера программу, которая выполняет некоторые вычисления и выводит их результаты в модальное диалоговое окно. Программы с такой организацией удобно использовать в качестве вспомогательных инструментальных средств при исследовании, например, логических или математических алгоритмов или средств языка С++, поскольку такие программы проще обычных программ с главным окном и, к тому же, в них легче организовать ввод и вывод информации. Поскольку мы еще не рассматривали различные формы элементов управления диалогом (окна редактирования, списки для вывода числовых или символьных массивов и пр.), наша программа будет весьма примитивной. В ней выполняются конкретные математические вычисления (определяется сумма целых чисел от 0 до 1000), и результат этих вычислений выводится в диалоговое окно в виде строки текста. На рис. 4.3 приведен вывод этой программы.
Рис. 4.3. Модальный диалог с результатом вычислений
/*Пример 4-2. Модальный диалог в качестве главного окна приложения*/
/*Файл 4-2.H*/
#define ID_1 100//Идентификатор текста
#define ID_OK 101//Идентификатор кнопки
BOOL CALLBACK DlgProc(HWND,UINT,WPARAM,LPARAM);
BOOL DlgOnInitDialog(HWND,HWND,LPARAM);
void DlgOnCommand(HWND,int,HWND,UINT);
/*Файл 4-2.RC*/
#include "4-2.h"
Math DIALOG 20, 20, 125, 44
CAPTION "Сумма чисел" {
CONTROL "", ID_1,"STATIC", SS_LEFT, 8, 8, 108, 10
CONTROL "Закрыть", ID_OK, "BUTTON", BS_PUSHBUTTON,
42,23,40,14
}
/*Файл 4-2.CPP*/
#include
#include
#include "4-2.h"
int result;
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE,LPSTR,int){
for(int i=0;i<1000;i++)
result+=i;//Получим результат
DialogBox(hInst,"Math",NULL,DlgProc);//Откроем диалог
return 0;
}
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;
}
}
BOOL DlgOnInitDialog(HWND hwnd,HWND,LPARAM){
char szText[50]="Сумма чисел = ";//Строка вывода
char res[20];//Строка для преобразования результата
itoa(result,res,10);//Преобразуем результат в строку
strcat(szText,res);//Дополним строку вывода
SetDlgItemText(hwnd,ID_1,szText);//Выведем в диалог
return TRUE;
}
void DlgOnCommand(HWND hwnd,int id,HWND,UINT){
switch(id){
case ID_OK: case IDCANCEL:
EndDialog(hwnd,0);//Закроем диалог
}
}
В файле ресурсов описываются вид и состав диалогового окна. В нем, кроме заголовка, имеются только два элемента управления – статический элемент управления (класс STATIC, стиль SSLEFT) и нажимаемая кнопка (класс BUTTON, стиль BSPUSHBUTTON). Обоим элементам присвоены идентификаторы (ID1 и IDOK).
Сама программа чрезвычайно проста. Поскольку в ней нет главного окна, то отсутствуют и все программные элементы, с ним связанные: действия по регистрации класса окна, его созданию и показу, оконная функция, функции обработки сообщений для главного окна. В функции Windows теперь только выполняются заданные вычисления (в нашем примере – в цикле суммируются 1000 чисел), после чего вызывается функция DialogBox(), создающая диалоговое окно. В параметрах этой функции указывается дескриптор приложения hInst, который берется из параметров функции WinMain(), имя диалогового окна, данное диалогу в файле ресурсов, NULL в качестве дескриптора окна-владельца (окном-владельцем в данном случае является рабочий стол Windows, а его дескриптор равен NULL) и, наконец, имя оконной функции диалогового окна.
Оконная функция диалога в нашем примере обрабатывает всего два сообщения: WMINITDIALOG и WMCOMMAND. Обработка второго сообщения позволяет реагировать на нажатие кнопок и . Первое же сообщение, об инициализации диалогового окна, как раз и используется для вывода в статический элемент управления результата вычислений. В функции DlgOnInitDialog() числовой результат, находящийся в глобальной переменной result, преобразуется с помощью функции itoa() в символьную форму, и полученная строка сцепляется со строкой комментария "Сумма чисел = ". Далее посредством функции SetDlgItemText() эта результирующая строка (szText) заносится в элемент управления с идентификатором ID_1.
Таким образом, отличительной чертой этого приложения является динамическое заполнение диалогового окна получаемыми в программе результатами. В нашем примере после закрытия диалога программа немедленно завершается предложением return 0, однако в ней вполне возможно предусмотреть дальнейшие вычисления с повторным созданием диалогового окна, в которое теперь будут помещены новые результаты. Из-за того, что в модальное диалоговое окно нельзя передать результаты непосредственно из программы (поскольку программа, как уже отмечалось, блокируется на время существования модального диалога), придется воспользоваться переменной-переключателем, примерно так, как это сделано в примере 3-1, только строки установки значения переключателя следует поместить в главную функцию, а строки анализа его значения – в функцию DlgOnInitDialog().