Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторный практикум «Основы разработки приложений Windows» книга 1.DOC
Скачиваний:
107
Добавлен:
10.05.2014
Размер:
721.41 Кб
Скачать

0,"Первая строка"

1,"Вторая строка"

2,"Третья строка"

... // и т. д.

}

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

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 <windows.h>

#include <windowsx.h>

#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);//Закрыть диалог

}

}