- •Лабораторный практикум «Основы разработки приложений Windows» Книга 1
- •Часть 1. Теоретические сведения4
- •Часть 2. Лабораторный практикум95
- •Часть 1 Теоретические сведения
- •1. Структура приложения Windows Простейшая программа с главным окном
- •Структура программы
- •Главная функция WinMain()
- •Регистрация класса окна
- •Создание и показ окна
- •Сообщения Windows и цикл их обработки
- •Оконная функция
- •Макрос handle_msg и структурирование программы
- •2. Интерфейс графических устройств
- •Простая программа, использующая средства gdi
- •Обработка сообщений wmpaint
- •Контекст устройства
- •Использование графических инструментов
- •3. Ресурсы: меню Простая программа с меню
- •Файл ресурсов
- •Описание меню в файле ресурсов
- •Сообщение wmcommand
- •Программное создание меню
- •Плавающее меню
- •Инструментальная панель
- •Всплывающие подсказки
- •0,"Первая строка"
- •1,"Вторая строка"
- •2,"Третья строка"
- •4. Ресурсы: диалоговые окна
- •Простая программа с меню и диалогом
- •Описание диалога в файле ресурсов
- •Обслуживание модального диалога
- •Модальный диалог как главное окно приложения
- •Немодальный диалог
- •Список в диалоговом окне
- •Окно редактирования и статический элемент управления
- •Графика в диалоговом окне
- •Перекрашивание диалогового окна и его элементов
- •Часть 2 Лабораторный практикум Работы лабораторного практикума Работа 1. Вызов функций Windows
- •Работа 2. Главное окно приложения (пример 1-1 из настоящего пособия)
- •Работа 3. Вывод в главное окно приложения текста и фигур (пример 2-1 из настоящего пособия)
- •Работа 4.Вывод в главное окно приложения текста и фигур (индивидуальное задание а)
- •Работа 5. Меню и модальный диалог (пример 4-1 из настоящего пособия)
- •Работа 6.Меню (индивидуальное задание в)
- •Работа 7.Модальный диалог в качестве главного окна приложения (индивидуальное задание с)
- •Работа 8.Вывод графика в главное окно приложения (индивидуальное заданиеD)
- •Работа 9. Немодальный диалог
- •Работа 10. Диалог с окном редактирования
- •Работа 11. Программное создание меню
- •Работа 12. Плавающее меню
- •Работа 13. График в диалоговом окне
- •Работа 14. Инструментальная панель (tool bar)
- •Работа 15. Инструментальная панель со всплывающими подсказками (tool tips)
- •Работа 16. Пользовательские пиктограммы и курсоры
- •Работа 17. Локализация программных продуктов
- •Индивидуальные задания лабораторного практикума
Модальный диалог как главное окно приложения
Использование разнообразных элементов управления позволяет формировать весьма сложные по структуре диалоговые окна, содержащие как средства ввода в программу требуемой числовой или символьной информации, так и средства вывода результатов ее работы. Многие прикладные задачи, в частности, носящие вычислительный характер, вполне удовлетворительно решаются с помощью программ, построенных на основе модального диалога (без главного окна). К приложениям с главным окном приходится прибегать, главным образом, в тех случаях, когда на экран требуется выводить рисунки (например, схемы процессов или установок) или графики. Если же результаты работы программы допустимо представлять в числовой форме, проще и удобнее использовать приложение на базе модального диалога.
Рассмотрим в качестве примера программу, которая выполняет некоторые вычисления и выводит их результаты в модальное диалоговое окно. Программы с такой организацией удобно использовать в качестве вспомогательных инструментальных средств при исследовании, например, логических или математических алгоритмов или средств языка С++, поскольку такие программы проще обычных программ с главным окном и, к тому же, в них легче организовать ввод и вывод информации. Поскольку мы еще не рассматривали различные формы элементов управления диалогом (окна редактирования, списки для вывода числовых или символьных массивов и пр.), наша программа будет весьма примитивной. В ней выполняются конкретные математические вычисления (определяется сумма целых чисел от 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 <windows.h>
#include <windowsx.h>
#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().