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

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

Содержание


Модальный диалог как главное окно приложения
Control "", id_1,"static", ss_left, 8, 8, 108, 10
Подобный материал:
1   ...   13   14   15   16   17   18   19   20   ...   24

Модальный диалог как главное окно приложения


Использование разнообразных элементов управления позволяет формировать весьма сложные по структуре диалоговые окна, содержащие как средства ввода в программу требуемой числовой или символьной информации, так и средства вывода результатов ее работы. Многие прикладные задачи, в частности, носящие вычислительный характер, вполне удовлетворительно решаются с помощью программ, построенных на основе модального диалога (без главного окна). К приложениям с главным окном приходится прибегать, главным образом, в тех случаях, когда на экран требуется выводить рисунки (например, схемы процессов или установок) или графики. Если же результаты работы программы допустимо представлять в числовой форме, проще и удобнее использовать приложение на базе модального диалога.

Рассмотрим в качестве примера программу, которая выполняет некоторые вычисления и выводит их результаты в модальное диалоговое окно. Программы с такой организацией удобно использовать в качестве вспомогательных инструментальных средств при исследовании, например, логических или математических алгоритмов или средств языка С++, поскольку такие программы проще обычных программ с главным окном и, к тому же, в них легче организовать ввод и вывод информации. Поскольку мы еще не рассматривали различные формы элементов управления диалогом (окна редактирования, списки для вывода числовых или символьных массивов и пр.), наша программа будет весьма примитивной. В ней выполняются конкретные математические вычисления (определяется сумма целых чисел от 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, стиль SSLEFT) и нажимаемая кнопка (класс BUTTON, стиль BSPUSHBUTTON). Обоим элементам присвоены идентификаторы (ID1 и IDOK).

Сама программа чрезвычайно проста. Поскольку в ней нет главного окна, то отсутствуют и все программные элементы, с ним связанные: действия по регистрации класса окна, его созданию и показу, оконная функция, функции обработки сообщений для главного окна. В функции Windows теперь только выполняются заданные вычисления (в нашем примере – в цикле суммируются 1000 чисел), после чего вызывается функция DialogBox(), создающая диалоговое окно. В параметрах этой функции указывается дескриптор приложения hInst, который берется из параметров функции WinMain(), имя диалогового окна, данное диалогу в файле ресурсов, NULL в качестве дескриптора окна-владельца (окном-владельцем в данном случае является рабочий стол Windows, а его дескриптор равен NULL) и, наконец, имя оконной функции диалогового окна.

Оконная функция диалога в нашем примере обрабатывает всего два сообщения: WMINITDIALOG и WMCOMMAND. Обработка второго сообщения позволяет реагировать на нажатие кнопок и . Первое же сообщение, об инициализации диалогового окна, как раз и используется для вывода в статический элемент управления результата вычислений. В функции DlgOnInitDialog() числовой результат, находящийся в глобальной переменной result, преобразуется с помощью функции itoa() в символьную форму, и полученная строка сцепляется со строкой комментария "Сумма чисел = ". Далее посредством функции SetDlgItem­Text() эта результирующая строка (szText) заносится в элемент управления с идентификатором ID_1.

Таким образом, отличительной чертой этого приложения является динамическое заполнение диалогового окна получаемыми в программе результатами. В нашем примере после закрытия диалога программа немедленно завершается предложением return 0, однако в ней вполне возможно предусмотреть дальнейшие вычисления с повторным созданием диалогового окна, в которое теперь будут помещены новые результаты. Из-за того, что в модальное диалоговое окно нельзя передать результаты непосредственно из программы (поскольку программа, как уже отмечалось, блокируется на время существования модального диалога), придется воспользоваться переменной-переклю­чателем, примерно так, как это сделано в примере 3-1, только строки установки значения переключателя следует поместить в главную функцию, а строки анализа его значения – в функцию Dlg­On­InitDialog().