Microsoft Visual C++ и MFC. Программирование для Win95 и WinNT

       

Приложение с модальной диалоговой панелью


В этом разделе мы расскажем о том, как создать простейшее приложение с единственной диалоговой панелью. Диалоговая панель будет содержать несколько кнопок, статическое текстовое поле и поле редактирования. В следующей главе мы расскажем, как создать более сложное приложение с главной диалоговой панелью при помощи средств автоматизированного проектирования MFC AppWizard и ClassWizard.

Создайте новый проект под названием MFDialog. В качестве типа приложения выберите из списка Type строку Application (рис. 4.1). Наберите в редакторе исходный текст приложения и сохраните его в файле MFDialog.cpp (листинг 2.13).

Листинг 2.13. Файл MFDialog.cpp

// Включаемый файл для MFC

#include <afxwin.h>

#include "resource.h"

//=====================================================

// Класс CMFDialogApp - главный класс приложения

//=====================================================

class CMFDialogApp : public CWinApp

{

public:

      // Мы будем переопределять метод InitInstance,

      // предназначенный для инициализации приложения

      virtual BOOL InitInstance();

};

 

// Создаем объект приложение класса CMFDialogApp

CMFDialogApp MFDialogApp;

 

//=====================================================

// Класс CMyDialog - класс диалоговой панели

//=====================================================

class CMyDialog : public CDialog

{

public:

      CMyDialog();

      CString m_Text;

protected:

      virtual void DoDataExchange(CDataExchange* pDX);

     

      // Обработчики сообщений от кнопок диалоговой панели

      afx_msg void OnDefault();

      virtual void OnCancel();

      virtual void OnOK();

      // Макрокоманда необходима, так как класс

      // CMyDialog обрабатывает сообщения от органов

      // управления диалоговой панели

      DECLARE_MESSAGE_MAP()

};

// Конструктор клаасса CMyDialog

CMyDialog::CMyDialog() : CDialog(CMyDialog::IDD)

{

      // Инициализируем переменную m_Text

      m_Text = "";


}

//=====================================================

// Метод DoDataExchange класса CMyDialog

//=====================================================

void CMyDialog::DoDataExchange(CDataExchange* pDX)

{

      CDialog::DoDataExchange(pDX);

      DDX_Text(pDX, IDC_EDIT, m_Text);

}

//=====================================================

// Таблица сообщений класса CMyDialog

//=====================================================

BEGIN_MESSAGE_MAP(CMyDialog, CDialog)

      ON_BN_CLICKED(IDC_DEFAULT, OnDefault)

END_MESSAGE_MAP()

//=====================================================

// Метод OnDefault класса CMyDialog

//=====================================================

void CMyDialog::OnDefault()

{

      // TODO:

      m_Text = "Start Text";

      UpdateData(FALSE);

      MessageBeep(0);

}

//=====================================================

// Метод OnCancel класса CMyDialog

//=====================================================

void CMyDialog::OnCancel()

{

      // Подаем звуковой сигнал

      MessageBeep(0);

      // Вызываем метод OnCancel базового класса

      CDialog::OnCancel();

}

//=====================================================

// Метод OnOK класса CMyDialog

//=====================================================

void CMyDialog::OnOK()

{

      // Вызываем метод OnOK базового класса

      CDialog::OnOK();

     

      // Подаем звуковой сигнал

      MessageBeep(0);

}

//=====================================================

// Метод InitInstance класса CMFDialogApp

//=====================================================

BOOL CMFDialogApp::InitInstance()

{

      // Создаем объект класса CMyDialog

      CMyDialog dlgTest;

      m_pMainWnd = &dlgTest;

      // Отображаем на экране модельную диалоговую панель

      dlgTest.DoModal();

      // Отображаем на экране значение переменной m_Text,

      // ввходящей в класс CMyDialog



      AfxMessageBox(dlgTest.m_Text);

      return FALSE;

}

Создайте файл ресурсов MFDlgRes.rc и добавьте в него новую диалоговую панель. На экране откроется окно редактора диалоговой панели и панель с инструментами Controls (рис. 2.28). По умолчанию новая диалоговая панель называется Dialog и содержит две кнопки OK и Cancel.

Вы можете добавлять в диалоговую панель другие органы управления - кнопки, переключатели, поля редактирования, статические текстовые поля, рисунки. Более того в Visual C++ версии 4.0 вам становятся доступны новые органы управления - многостраничные диалоговые панели, поля для просмотра видеоинформации и т. д.

Приложение с модальной диалоговой панелью


Рис. 2.28. Создание диалоговой панели

В следующей таблице мы кратко описали органы управления диалоговой панели, которые можно добавлять с помощью панели инструментов Controls.

Кнопка

Название

Описание

Приложение с модальной диалоговой панелью


Select

Если вы нажмете эту кнопку, то сможете выбрать органы управления, которые уже расположены в диалоговой панели

Приложение с модальной диалоговой панелью


Picture

Рисунок

Приложение с модальной диалоговой панелью


Static Text

Статическое текстовое поле

Приложение с модальной диалоговой панелью


Edit Box

Поле редактирования

Приложение с модальной диалоговой панелью


Group Box

Прямоугольник, объединяющий группу органов управления

Приложение с модальной диалоговой панелью


Button

Кнопка

Приложение с модальной диалоговой панелью


Check Box

Переключатель в виде прямоугольника

Приложение с модальной диалоговой панелью


Radio Button

Переключатель круглой формы (радиопереключатель)

Приложение с модальной диалоговой панелью


Combo Box

Список с окном редактирования

Приложение с модальной диалоговой панелью


List Box

Список

Приложение с модальной диалоговой панелью


Horizontal Scroll Bar

Горизонтальная полоса просмотра

Приложение с модальной диалоговой панелью


Vertical Scroll Bar

Вертикальная полоса просмотра

Приложение с модальной диалоговой панелью


Animate

Окно просмотра видео

Приложение с модальной диалоговой панелью


Tab Control

Позволяет размещать в диалоговой панели несколько страниц органов управления, каждая из которых имеет “закладку”. Пользователь одновременно видит закладки всех страниц и может выбрать любую из них.

Приложение с модальной диалоговой панелью


Tree Control

Позволяет просматривать иерархические (древовидные) структуры данных. Такой орган управления можно использовать для отображения структуры каталогов на диске, заголовков статей справочной системы и т. д.

Приложение с модальной диалоговой панелью


List Control

Может использоваться для отображения списка пиктограмм

Приложение с модальной диалоговой панелью


Hot Key

Орган управления Hot Key предназначен для ввода комбинации клавиш акселераторов

Приложение с модальной диалоговой панелью


Slider

Движок. Обычно используется при отображении видеоинформации. Позволяет перейти к просмотру произвольного кадра

Приложение с модальной диалоговой панелью


Progress

Линейный индикатор. Позволяет отображать на экране ход какого-нибудь процесса, например процесса копирования файлов

Приложение с модальной диалоговой панелью


Spin

Обычно используется для увеличения или уменьшения значения какого-нибудь параметра

Приложение с модальной диалоговой панелью


Custom Control

Орган управления, внешний вид и назначение которого определяется пользователем

<


Для нашего первого приложения с диалоговой панелью вам надо добавить только одну кнопку, одно текстовое поле и одно поле редактирования.

Сначала добавьте кнопку. Для этого щелкните по изображению кнопки в панели Controls. Затем переместите указатель мыши в то место диалоговой панели, где вы желаете разместить кнопку и нажмите левую клавишу мыши. В диалоговой панели появится изображение кнопки, названное по умолчанию Button1. Выполните по ней двойной щелчок левой клавишей мыши. На экране появится панель Push Button Propeties, определяющая различные характеристики кнопки. В первую очередь вас будут интересовать поля Caption и ID. В поле Caption введите название кнопки Default, а в поле ID ее идентификатор IDC_DEFAULT. Остальные характеристики кнопки оставьте без изменения.

Находясь в редакторе ресурсов вы можете сразу попробовать как работает диалоговая панель. Найдите диалоговую панель Dialog (рис. 2.29). Если ее нет на экране, выберите из меню View строку Toolbars и в открывшейся диалоговой панели Toolbars установите переключатель Dialog. Диалоговая панель Dialog содержит ряд кнопок. Первая кнопка, на которой нарисован тумблер, позволяет проверить, как будет работать диалоговая панель.

Приложение с модальной диалоговой панелью


Рис. 2.29. Панель управления Dialog

Остальные кнопки диалоговой панели Dialog позволяют задавать выравнивание органов управления друг относительно друга и относительно границ панели. Последние две кнопки устанавливают разметку на диалоговой панели. Разметка поможет вам ровнее разместить органы управления.

Вы можете изменить заголовок диалоговой панели, ее идентификатор и многие другие параметры, если сделаете двойной щелчок левой кнопкой мыши по заголовку диалоговой панели. На экране появится панель Dialog Properties, содержащая несколько страниц. Выберите страницу General (рис. 2.30).

Приложение с модальной диалоговой панелью


Рис. 2.30. Характеристики диалоговой панели

В поле ID вы можете изменить идентификатор диалоговой панели, в поле Caption - заголовок диалоговой панели. В полях Font name и Font size отображается тип и размер шрифта, который используется для всех текстов в диалоговой панели. Изменить параметры шрифта можно, нажав кнопку Font. Поля X Pos и Y Pos позволяют указать начальное положение диалоговой панели на экране. Если X Pos и Y Pos содержат нулевые значения, начальное положение диалоговой панели определяется операционной системой.



Диалоговая панель может иметь собственное меню. Это меню будет отображаться непосредственно под заголовком диалоговой панели. Если вы желаете подключить к диалоговой панели меню, сначала разработайте меню и запишите его в файл ресурсов. Затем выберите в диалоговой панели Dialog Properties идентификатор данного меню из списка Menu.

Для приложения MFDialog вам надо поменять только идентификатор диалоговой панели и ее название. Измените идентификатор диалоговой панели с IDD_DIALOG1 на “DIALOGPANEL”, а ее заголовок - с Dialog на My Dialog. Остальные характеристики диалоговой панели оставьте без изменения.

Итак, диалоговая панель “DIALOGPANEL” приложения MFDialog содержит три кнопки, одно статическое текстовое поле и одно поле редактирования. В листинге 2.14 представлен фрагмент файла ресурсов в котором определяется диалоговая панель приложения.

Листинг 2.14. Фрагмент файла MFDlgRes.rc

//////////////////////////////////////////////////////////////

// Диалоговая панель

//

DIALOGPANEL DIALOG DISCARDABLE  0, 0, 186, 46

STYLE DS_MODALFRAME|DS_CENTER|WS_POPUP|WS_CAPTION|WS_SYSMENU

CAPTION "My Dialog"

FONT 8, "MS Sans Serif"

BEGIN

    DEFPUSHBUTTON   "OK",IDOK,129,7,50,14

    PUSHBUTTON      "Cancel",IDCANCEL,129,24,50,14

    PUSHBUTTON      "Default",IDC_DEFAULT,70,7,50,14

    EDITTEXT        IDC_EDIT,7,24,113,14,ES_AUTOHSCROLL

    LTEXT           "Line Editor",IDC_STATIC,9,10,34,8

END

Идентификаторы, задействованные в файле ресурсов приложения по умолчанию, определяются во включаемом файле resource.h. Мы привели этот файл в листинге 2.15. Вы можете изменить название включаемого файла, выбрав из меню View строку Resource Includes.

Листинг 2.15. Файл resource.h

//{{NO_DEPENDENCIES}}

// Включаемый файл, созданный Microsoft Developer Studio

// Используется в файле ресурсов MFDlgRes.rc

//

#define IDR_MENU               101

#define IDC_DEFAULT            1000

#define IDC_EDIT               1001



#define ID_TEST_DIALOG         40001

#define ID_TEST_EXIT           40002

// Следующие значения идентификаторов используются по

// умолчанию для новых объектов

#ifdef APSTUDIO_INVOKED

      #ifndef APSTUDIO_READONLY_SYMBOLS

             #define _APS_NEXT_RESOURCE_VALUE        103

             #define _APS_NEXT_COMMAND_VALUE         40003

             #define _APS_NEXT_CONTROL_VALUE         1003

             #define _APS_NEXT_SYMED_VALUE           101

      #endif

#endif

Обратите внимание, что включаемый файл resource.h содержит не только определения идентификаторов, но также дополнительную служебную информацию. Она расположена после директивы #ifdef APSTUDIO_INVOKED и представляет собой ряд макроопределений. Данные макроопределения используются редактором ресурсов при создании новых идентификаторов.

Откройте страницу ClassView в окне Project Workspace. Обратите внимание, что если вы переместите окно Project Workspace к границе главного окна Visual C++, его заголовок пропадет и окно станет похоже на обычную панель управления. Если горизонтальный размер окна Project Workspace уменьшится, тогда исчезнут названия в закладках страниц и останутся только маленькие пиктограммы (рис. 2.31).

В ней отображаются два класса CMFDialogApp и CMyDialog. В главный класс приложения CMFDialogApp входит метод InitInstance. В класс CMyDialog входит конструктор CMyDialog, метод DoDataExchange, предназначенный для обмена данными между органами управления диалоговой панели и привязанных к ним переменных, а также методы OnOK, OnCancel и OnDefault. Последние три метода вызываются когда пользователь нажимает на кнопки OK, Cancel и Default, расположенные в диалоговой панели. Кроме того, определена глобальная переменная MFDialogApp.

Приложение с модальной диалоговой панелью


Рис. 2.31. Классы проекта MFDialog

Страница ResourceView окна Project Workspace показывает все ресурсы, входящие в проект (рис. 2.32). В приложении MFDialog определен только один ресурс - диалоговая панель, имеющая идентификатор “DIALOGPANEL”.



Приложение с модальной диалоговой панелью


Рис. 2.32. Ресурсы проекта MFDialog

Постройте проект и запустите полученный выполнимый файл. На экране появится диалоговая панель My Dialog, определенная в файле ресурсов нашего проекта (рис. 2.33). Вначале поле редактирования Line Editor пустое. В нем вы можете ввести любой текст. Если вы нажмете на кнопку Default, тогда все, что вы ввели в поле редактирования Line Editor, пропадает и в нем отображается строка Start Text.

Кроме кнопки Default в диалоговой панели My Dialog находятся еще две кнопки OK и Cancel. Если вы нажмете кнопку OK, тогда диалоговая панель закрывается, а на экране появляется текстовое сообщение, содержащее текст, введенный вами в поле Line Editor. Если нажать кнопку Cancel, то диалоговая панель My Dialog также закроется, но сообщение с введенным вами текстом не появится.

Приложение с модальной диалоговой панелью


Рис. 2.33. Приложение MFDialog

Рассмотренное нами приложение MFDialog можно создать значительно быстрее, если воспользоваться средствами автоматизированной разработки приложений MFC AppWizard и ClassWizard. Используя эти средства, вы будете избавлены от необходимости вручную набивать в текстовом редакторе код приложения и сможете сконцентрировать свои усилия на реализации обработчиков сообщений от органов управления диалоговой панели.


Содержание раздела