Исходный текст программы с простым модальным диалогом

На рис. 28.1. продемонстрировано функционирование программы 28-1.

//Приложение 28-1. Простейший модальный диалог.

//Файл 28-1.h #define About 100 #define CM_ABOUT 200 #define CM_EXIT 24310

//Файл 28-1.rc # include "28-1.h" MainMenu MENU{ POPUP "Файл")

MENUITEM "О программе...",CM_ABOUT MENUITEM SEPARATOR MENUITEM "Выход",CM_EXIT } }

MyIcon ICON "rabbit.ico" About DIALOG 7, 37, 222, 105

STYLE DS_MODALFRAME|WS_POPUP|WS_VISIBLE|WS_CAPTION|WS_SYSMENU CLASS "bordlg" CAPTION "О программе" FONT 8, "MS Sans Serif"{

CONTROL "",IDOK,"BorBtn",BS_PUSHBUTTON|WS_CHILD|WS_VISIBLE|

WS_TABSTOP,144,75,37,25

CONTROL "", -1,"BorShade",BSS_HDIP|BSS_LEFT|WS_CHILD|WS_VISIBLE,6,66,206,2 CTEXT "В данной программе создается простейший модальный диалог без" " каких-либо органов управления (не считая кнопки выхода). " "Органы управления диалогом (поля ввода текста, различные кнопки) "


Диалоговые окна 255

"будут продемонстрированы в последующих примерах.",

-1,9,10,202,47, ss_center|not ws_group

ICON "MyIcon",-1,30,77,16,16

}

/ /Файл 28-1.cpp

#include <owl\framewin.h>

#include <owl\dialog.h>

#include "28-1.h"

/*Класс приложения, производный oт Tapplication*/

class MyApp:public TApplication{

public:

void InitMainWindow(); //Замещаем функцию InitMainWindow

};

/*Класс главного окна, производный от TframeWindow*/ class MyWindow:public TFrameWindow{

HICON hIcon; //Дескриптор нашего значка - данное-член класса MyWindow

public:

MyWindow(TWindow*parent,char far*title);

void GetWindowClass(WNDCLASS&); //Замещаем ради установки нашего значка

void CmAbout(); //Функция отклика на пункт "О программе"

DECLARE_RESPONSE_TABLE(MyWindow);

); /*Таблица откликов класса MyWindow* /

DEFINE_RESPONSE_TABLE1(MyWindow,TFrameWindow)

EV_COMMAND(CM_ABOUT,CmAbout), END_RESPONSE_TABLE; /*Конструктор главного окна*/ MyWindow::MyWindow(TWindow*parent,char far*title):TFrameWindow(parent,title){

AssignMenu("MainMenu");

hIcon=GetApplication()->TModule::LoadIcon("MyIcon");

}

/* Функции-члены класса MyWindow*/ void MyWindow::CmAbout (){

TDialog* myDlg=new TDialog(this,About);

myDlg->Execute();

} void MyWindow::GetWindowClass(WNDCLASS&wc){

TWindow::GetWindowClass(wc); //Вызываем исходную функцию GetWindowClass

we.hIcon=hIcon; //Устанавливаем наш значок в структуре NNDCLASS

} void MyApp::InitMainWindow(void){

EnableBWCC(); //Чтобы приложение работало вне среды Borland C++

SetMainWindow(new MyWindow(0,"Программа 28-1"));

}

/*Главная функция приложения OwlMain*/ int OwlMain(int,char*[]){

return MyApp(). Run ();

}

Так же, как и при процедурном программировании с помощью вызовов функций API Windows, включение диалоговых окон в OWL-приложение требует, прежде всего, их описания в файле ресурсов. Диалог для данного примера готовился не в текстовом редакторе, а в программе Resource Workshop, что позволило придать диалогу "стиль Borland", не обременяя себя поиском ключевых слов ("BorBtn", "BorShade", BSS_HDIP и др.), описывающих различные оформительские элементы диалогового окна. Применение к диалогу стиля Borland определяется строкой

CLASS "bordlg"

в начале описания диалога, а также использованием упомянутых выше классов элементов диалогового окна (например, класс кнопки BorBtn или класс разделительной полосы BorShade) и констант, опреде­ляющих стиль этих элементов (например, BSS_HDIP).

Отметим две другие особенности данного диалога. Во-первых, с помощью предложения FONT, включенного в заголовок секции описания диалога, определено использование в диалоговом окне шриф­та меньшего, чем по умолчанию, размера, что делает диалог более компактным и изящным. Во-вторых, в диалоговое окно помещено изображение прикладной пиктограммы-значка (с изображением кролика в шляпе фокусника). Сделать это очень просто - достаточно в число элементов диалога включить "орган управления" класса ICON с указанием, как обычно, имени ресурса ("MyIcon"), его идентификатора (-1), а также координат и размеров. Для связи имени ресурса с файлом, содержащим изображение конкретного значка, в файл ресурсов включено предложение ICON.


256 Глава 28


Свойства и возможности диалоговых окон описаны в классе OWL TDialog, производном от TWindow. Для придания диалогу, создаваемому в приложении, необходимых черт, в общем случае в приложении создается класс, производный от TDialog (MyDia-log на рис. 28.2). Этот класс можно дополнить любыми членами, требуемыми для функционирования диалога, прежде всего, функциями отклика на сообщения от органов управления диало­гом. Однако в настоящем примере рассматривается простейший вариант создания диалога, в котором, кроме кнопки ОК, заботу о которой берет на себя OWL, нет никаких органов управления. В этом случае нет необходимости вводить производный класс, дос­таточно создать объект исходного класса TDialog.

В примере 28-1 диалоговое окно, содержащее некоторую информацию о программе, активизируется выбором пункта "О программе" главного меню. Как было описано в предыдущей главе, для включения в приложение главного меню необходимо выполнить следующие операции:

• включить в файл ресурсов описание меню

• назначить это меню приложению в конструкторе главного окна функцией AssignMenu()

• определить в классе главного окна таблицу откликов на сообщения от меню с указанием имен
функций откликов

• определить в программе сами функции отклика для обслуживанию пунктов меню

В нашем случае в таблице откликов указано, что сообщения WM_COMMAND от пункта меню CM_ABOUT будут обрабатываться функцией класса MyWindow CmAbout().

В функции CmAbout() создается объект класса TDialog с указателем myDlg и для этого объекта вы­зывается функция Execute(), которая создает и обслуживает модальное диалоговое окно (немодальный диалог активизируется с помощью функции TDialog::Create()). Как известно, для модального диалога ха­рактерно блокирование (до его закрытия) органов управления остальных окон приложения. Все время, пока мы работаем с органами управления модального диалога, функция Execute() является активной. За­крытие модального диалога приводит к завершению этой функции и передаче управления в приложение.

Указатель myDlg на объект класса TDialog используется в программе лишь для вызова для этого объекта функции Execute(), и вводить для него специальное обозначение нет необходимости. Исключив явное именование этого указателя, можно упростить текст функции CmAbout():

void MyWindow::CmAbout(){

new TDialog(this,About)->Execute(); }

Поскольку в рассматриваемом приложении для украшения диалогового окна используется собствен­ный значок, есть смысл назначить его значком всего приложения. Это процедура, подробно описанная в гл. 26, включает две операции: загрузку значка-ресурса из выполнимого модуля приложения и включе­ние его в структуру WNDCLASS. Первая операция выполняется в конструкторе главного окна с помо­щью функции LoadIcon():

hIcon=GetApplication()->TModule::LoadIcon("MyIcon");

Функция LoadIcon() принадлежит классу TModule, и для вызова ее из функции класса MyWindow необходимо указать объект класса TModule или производного от него, для которого она вызывается. В нашем случае речь идет об экземпляре приложения, указатель на который можно получить с помощью функции TWindow::GetApplication(). Как уже отмечалось, если в функции некоторого класса вызывается функция другого класса, необходимо указать, какому классу она принадлежит, что и сделано с помощью конструкции TModule::LoadIcon().

Помещение в структуру WNDCLASS дескриптора загруженного ранее значка осуществляется в за­мещенной нами функции класса TWindow GetWindowClass() (подробности см. в гл. 26):

void MyWindow::GetWindowClass(WNDCLASS&wc){

TWindow::GetWindowClass(wc); //Вызываем исходную функцию GetWindowClass

we.hIcon=hIcon; //Устанавливаем наш значок в структуре NNDCLASS

}

Дескриптор hIcon введен в класс MyWindow в качестве закрытого члена. Такое построение програм­мы повышает ее наглядность, но несколько увеличивает объем. Поскольку, как и в рассмотренном выше случае с указателем на объект диалогового окна, дескриптор hIcon используется в программе лишь в од­ном месте, можно исключить его явное объявление среди данных-членов класса MyWindow и получить в неявном виде прямо в функции GetWindowClass(), совместив в одном предложении и загрузку ресурса, и занесение его дескриптора в структуру WNDCLASS:

we.hIcon=GetApplication()->TModule::LoadIcon("MyIcon");

В этом варианте отпадает необходимость загружать ресурс-значок в конструкторе главного окна.


Диалоговые окна_________________________________________________ 257


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: