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. Используя эти средства, вы будете избавлены от необходимости вручную набивать в текстовом редакторе код приложения и сможете сконцентрировать свои усилия на реализации обработчиков сообщений от органов управления диалоговой панели.


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







Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий