Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

Microsoft Visual C++ и MFC. Программирование для Windows 95 и Windows NT (часть 2)

© Александр Фролов, Григорий Фролов
Том 28, М.: Диалог-МИФИ, 1996, 288 стр.

[Назад] [Содеожание] [Дальше]

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

В том случае, если в панели управления приложения надо разместить много разнообразных органов управления, то значительно удобнее создать его на основе другого класса, имеющего название CDialogBar:

CDialogBar <- CControlBar <- CWnd <- CCmdTarget <- CObject

Этот класс, также как класс CToolBar, наследован от базового класса CControlBar. Класс CDialogBar позволяет создать диалоговую панель управления на основе шаблона диалоговой панели. В отличии от обычной диалоговой панели, диалоговая панель управления, созданная на основе класса CDialogBar, имеет все свойства панели управления. Она может быть присоединена к одной из границ окна или может отображаться в отдельном мини-окне.

Приложение может иметь несколько панелей управления, созданных на основе классов CToolBar и CDialogBar.

Методы класса CDialogBar

Непосредственно в состав класса CDialogBar входят всего два метода - это конструктор класса CDialogBar и метод Create.

Конструктор класса CDialogBar создает только соответствующий объект, но не саму панель управления:


CDialogBar();

Чтобы создать панель управления, следует вызвать метод Create и указать ему шаблон диалоговой панели, используемый для создания диалоговой панели управления.

Метод Create имеет два различных формата:


BOOL 
Create(
   CWnd* pParentWnd,
   LPCTSTR lpszTemplateName,
   UINT nStyle,
   UINT nID
);

BOOL 
Create(
   CWnd* pParentWnd,
   UINT nIDTemplate,
   UINT nStyle,
   UINT nID
);

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

Второй параметр метода Create указывает шаблон панели управления. В зависимости от того, как определена панель управления, в качестве второго параметра можно использовать либо идентификатор шаблона диалоговой панели nIDTemplate, либо его имя lpszTemplateName.

Третий параметр nStyle определяет начальное положение диалоговой панели управления в окне приложения. Вы можете указать следующие флаги: CBRS_TOP, CBRS_BOTTOM, CBRS_LEFT и CBRS_RIGHT. Они позволяют установить панель управления соответственно у верхней, нижней, левой или правой границы окна.

Форма диалоговой панели управления зависит от шаблона диалоговой панели и ее расположения в окне приложения. В случае если диалоговая панель управления отображается в верхней или нижней части окна (параметр nStyle равен CBRS_TOP или CBRS_BOTTOM), то ширина панели управления соответствует ширине окна CWnd, а высота - высоте шаблона диалоговой панели. Если же диалоговая панель управления отображается с левой или правой части окна (параметр nStyle равен CBRS_LEFT или CBRS_RIGHT), то ширина панели управления соответствует ширине шаблона диалоговой панели, а высота - высоте окна CWnd.

Последний параметр nID определяет идентификатор диалоговой панели управления.

В случае успешного создания диалоговой панели управления метод Create возвращает ненулевое значение. Если при создании панели управления обнаружены ошибки, например, вы указали несуществующий шаблон диалоговой панели, тогда метод Create возвращает нулевое значение.

Процедура создания диалоговой панели управления

Как и в случае разработки обычных диалоговый панелей, сначала следует подготовить шаблон диалоговой панели, которая будет использоваться в качестве панели управления. Для этого можно воспользоваться редактором ресурсов Microsoft Visual C++.

В шаблоне диалоговой панели следует установить только один стиль - WS_CHILD. Диалоговая панель управления будет выступать в качестве дочернего окна и не должна иметь ни заголовка ни рамки.

Готовый шаблон следует сохранить в файле ресурсов проекта. На этом подготовка шаблона диалоговой панели управления считается законченной и надо приступить к написанию программного кода для работы с нею.

В состав класса окна, в котором будет отображаться диалоговая панель управления, надо включить элемент данных класса CDialogBar. Этот элемент данных будет представлять диалоговую панель управления. Если диалоговая панель управления достаточно сложна и имеет много органов управления, то можно создать для нее отдельный класс на основе базового класса CDialogBar. Этот класс следует дополнить методами, обрабатывающими сообщения от органов управления панели. Таким образом вы сможете разгрузить таблицу сообщений главного окна приложения.

Затем надо переопределить метод OnCreate класса окна и добавить в нем вызов метода Create класса CDialogBar для объекта представляющего диалоговую панель управления.

Если вы добавляете диалоговую панель управления к приложению, созданному с использованием средств MFC AppWizard, то в нем уже определен метод OnCreate и вам только остается добавить в него соответствующий вызов метода Create.

Органы управления диалоговой панели передают сообщения непосредственно своему родительскому окну. Добавьте в таблицу сообщений класса окна соответствующие макрокоманды для получения сообщений и включите в класс окна методы для их обработки.

В следующем разделе мы реализуем только что описанный алгоритм создания диалоговой панели управления на примере приложения DialogBar.

Приложение DialogBar

Создайте новый проект под названием DialogBar. В качестве типа приложения выберите из списка Type строку Application. Настройте проект DialogBar, точно также как вы настраивали проекты Bar и MultiBar: укажите, что приложение будет работать с библиотекой классов MFC.

Наберите в редакторе исходный текст приложения и сохраните его в файле DialogBar.cpp (листинг 3.10). Чтобы ускорить набор исходного текста приложения, за основу вы можете взять файл Bar.cpp приложения Bar. Готовый файл DialogBar.cpp включите в проект.

Листинг 3.10. Файл DialogBar.cpp


//============================================================
// Приложение DialogBar
// (c) Frolov G.V., 1996
// E-mail: frolov@glas.apc.org
//============================================================
// Исключаем редко используемые определения из 
// включаемых файлов
#define VC_EXTRALEAN		

// Включаемый файл для MFC
#include <fxwin.h>
#include <afxext.h>
#include <afxcmn.h>

// Включаемый файл для ресурсов приложения
#include "resource.h"

//============================================================
// Класс CDlgBarApp - главный класс приложения 
//============================================================
class CDlgBarApp : public CWinApp
{
public:
   // Мы будем переопределять метод InitInstance
   virtual BOOL InitInstance();
};
 
// Создаем объект приложение класса CDlgBarApp
CDlgBarApp DlgBarApp;
 
//============================================================
// Класс CDlgBarWindow - представляет главное окно 
//============================================================
class CDlgBarWindow : public CFrameWnd
{
// Определяем панель управления
protected: 
   // Панель управления на основе класса CDialogBar       
   CDialogBar       m_wndDialogBar;
   
protected:
   // Метод OnCreate используется для создания диалоговой 
   // панели управления
   afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);

public:
   // Объявляем конструктор класса CDlgBarWindow
   CDlgBarWindow();

   // Объявляем методы для обработки команд от диалоговой 
   // панелей управления
   afx_msg BOOL DlgBarCommand(UINT nID);
   afx_msg void DlgBarCombo();
   
   // Макрокоманда необходима, так как класс 
   // CDlgBarWindow обрабатывает сообщения
   DECLARE_MESSAGE_MAP()    
}; 

//============================================================
// Метод BarCommand
// Обрабатывает команды, выводит на экран сообщение
//============================================================
BOOL CDlgBarWindow::DlgBarCommand(UINT nID)
{
   CString szCommandAbout;

   // Загружаем текстовую строку с идентификатором, 
   // соответствующим идентификатору поступившего командного 
   // сообщения и выводим ее на экран
   if(szCommandAbout.LoadString(nID))
      MessageBox(szCommandAbout);

   else 
   {
      // Ошибка при загрузке строкового ресурса
      TRACE0("Failed to load string\n");
      return -1;      
   }
   
   return TRUE;
}

//============================================================
// Метод DlgBarCombo
// Обрабатывает команды, выводит на экран сообщение
//============================================================
void CDlgBarWindow::DlgBarCombo()
{
   // Отображаем сообщение о том, что сделан выбор из списка 
   MessageBox("Combo-box selection changed");
}

//============================================================
// Таблица сообщений класса CDlgBarWindow
//============================================================
BEGIN_MESSAGE_MAP(CDlgBarWindow, CFrameWnd)

   // Макрокоманда вызывает метод OnCreate
   ON_WM_CREATE()

//============================================================
   // Обработчики команд от диалоговой панели управления 
   // Командные сообщения от кнопок Set и Clear
   ON_COMMAND_EX(IDC_BUTTON_SET, DlgBarCommand)
   ON_COMMAND_EX(IDC_BUTTON_CLEAR, DlgBarCommand)
   ON_COMMAND_EX(IDC_CHECK1, DlgBarCommand)

   // Командные сообщения от переключателя Alighn 
   ON_COMMAND_EX(IDC_RADIO_LEFT, DlgBarCommand)
   ON_COMMAND_EX(IDC_RADIO_CENTER, DlgBarCommand)
   ON_COMMAND_EX(IDC_RADIO_RIGHT, DlgBarCommand)
   
   // Командные сообщения от списка combo-box
   ON_CBN_SELCHANGE( IDC_COMBO_COLOUR, DlgBarCombo)
   
END_MESSAGE_MAP()

//============================================================
// Метод InitInstance класса CDlgBarApp
// Создает главное окно приложения и отображает его на экране
//============================================================
BOOL CDlgBarApp::InitInstance()
{
   m_pMainWnd = new CDlgBarWindow();
   m_pMainWnd -> ShowWindow(m_nCmdShow);
   m_pMainWnd -> UpdateWindow();

   return TRUE;
}

//============================================================
// Конструктор класса CDlgBarWindow
//============================================================
CDlgBarWindow::CDlgBarWindow()
{ 
   // Создаем окно приложения, соответствующее 
   // данному объекту класса CDlgBarWindow
   Create(NULL, "Dialog Bar", WS_OVERLAPPEDWINDOW,
          rectDefault, NULL); 
}

//============================================================
// Метод OnCreate класса CDlgBarWindow
// Используется для создания панелей управления
//============================================================
int CDlgBarWindow::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
   // Вызываем метод OnCreate базового класса
   if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
      return -1;

//============================================================
   // Создаем диалоговую панель управления 

   if (!m_wndDialogBar.Create(this, IDD_DIALOG_BAR, CBRS_TOP,
                              IDD_DIALOG_BAR))
   {
      // Ошибка при создании диалоговой панели управления
      TRACE0(>Failed to create dialog bar\n>);
      return -1;
   }
   return 0;
}

Создайте новый файл ресурсов и включите его в проект под именем DialogBar.rc. Создайте шаблон диалоговой панели, которая будет использоваться в качестве диалоговой панели управления.

Откройте панель свойств редактируемой панели управления Dialog Properties. Откройте страницу General и присвойте диалоговой панели идентификатор IDD_DIALOG_BAR. Затем откройте страницу Styles. Выберите из списка Style стиль диалоговой панели Child. Укажите, что диалоговая панель не имеет рамки - из списка Border надо выбрать строку None. Все остальные переключатели из страницы Styles и из страниц More Styles и Extended Styles должны быть отключены.

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

Разместите в шаблоне диалоговой панели несколько органов управления. Для нашего примера вам надо создать две кнопки Set и Clear с идентификаторами IDC_BUTTON_SET и IDC_BUTTON_CLEAR, три переключателя Left, Center и Right с зависимой фиксацией, имеющие идентификаторы IDC_RADIO_LEFT, IDC_RADIO_CENTER и IDC_RADIO_RIGHT, а также список combo-box с идентификатором IDC_COMBO_COLOUR. В список IDC_COMBO_COLOUR внесите несколько начальных значений. Мы записали в него названия различных цветов - Red, Blue, Green, Yellow, Black и White. Эти строки будут содержаться в списке сразу после отображения на экране диалоговой панели.

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

Мы привели файл ресурсов, который у вас должен получиться в листинге 3.11.

Листинг 3.11. Файл DialogBar.rc


//Microsoft Developer Studio generated resource script.
//
#include "resource.h"

#define APSTUDIO_READONLY_SYMBOLS
//////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "afxres.h"

//////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS

//////////////////////////////////////////////////////////////
//
// Russian resources

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_RUS)
#ifdef _WIN32
LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
#pragma code_page(1251)
#endif //_WIN32

#ifdef APSTUDIO_INVOKED
//////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//

1 TEXTINCLUDE DISCARDABLE 
BEGIN
    "resource.h\0"
END

2 TEXTINCLUDE DISCARDABLE 
BEGIN
    "#include ""afxres.h""\r\n"
    "\0"
END

3 TEXTINCLUDE DISCARDABLE 
BEGIN
    "\r\n"
    "\0"
END

#endif    // APSTUDIO_INVOKED

//////////////////////////////////////////////////////////////
//
// Dialog
//

IDD_DIALOG_BAR DIALOG DISCARDABLE  0, 0, 227, 50
STYLE WS_CHILD
FONT 8, "MS Sans Serif"
BEGIN
    CONTROL     "Left", IDC_RADIO_LEFT, "Button", 
                   BS_AUTORADIOBUTTON, 95, 10, 40,10
    CONTROL     "Center", IDC_RADIO_CENTER, "Button", 
                   BS_AUTORADIOBUTTON, 95, 19, 45, 11
    CONTROL     "Right", IDC_RADIO_RIGHT, "Button", 
                   BS_AUTORADIOBUTTON, 95, 30, 40, 9
    GROUPBOX    "Aligns",IDC_STATIC,85,0,80,45
    PUSHBUTTON  "Set",IDC_BUTTON_SET,175,5,45,15
    PUSHBUTTON  "Clear",IDC_BUTTON_CLEAR,175,30,45,15
    COMBOBOX    IDC_COMBO_COLOUR, 5, 5, 70, 50, 
                   CBS_DROPDOWNLIST | CBS_SORT | 
                   WS_VSCROLL | WS_TABSTOP
END

//////////////////////////////////////////////////////////////
//
// DESIGNINFO
//

#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO DISCARDABLE 
BEGIN
    IDD_DIALOG_BAR, DIALOG
    BEGIN
        LEFTMARGIN, 7
        RIGHTMARGIN, 220
        TOPMARGIN, 7
        BOTTOMMARGIN, 43
    END
END
#endif    // APSTUDIO_INVOKED

//////////////////////////////////////////////////////////////
//
// Dialog Info
//

IDD_DIALOG_BAR DLGINIT
BEGIN
    IDC_COMBO_COLOUR, 0x403, 4, 0
0x6552, 0x0064, 
    IDC_COMBO_COLOUR, 0x403, 5, 0
0x6c42, 0x6575, "\000" 
    IDC_COMBO_COLOUR, 0x403, 6, 0
0x7247, 0x6565, 0x006e, 
    IDC_COMBO_COLOUR, 0x403, 7, 0
0x6559, 0x6c6c, 0x776f, "\000" 
    IDC_COMBO_COLOUR, 0x403, 6, 0
0x6c42, 0x6361, 0x006b, 
    IDC_COMBO_COLOUR, 0x403, 6, 0
0x6857, 0x7469, 0x0065, 
    0
END

//////////////////////////////////////////////////////////////
//
// String Table
//

STRINGTABLE DISCARDABLE 
BEGIN
    IDC_RADIO_LEFT          "Left radio box"
    IDC_RADIO_CENTER        "Center radio box"
    IDC_RADIO_RIGHT         "Right radio box"
    IDC_BUTTON_SET          "Set button pressed"
END

STRINGTABLE DISCARDABLE 
BEGIN
    IDC_BUTTON_CLEAR        "Clear button pressed"
END

#endif    // Russian resources
//////////////////////////////////////////////////////////////

#ifndef APSTUDIO_INVOKED
//////////////////////////////////////////////////////////////
// Generated from the TEXTINCLUDE 3 resource.
//

//////////////////////////////////////////////////////////////
#endif    // not APSTUDIO_INVOKED

Идентификаторы ресурсов приложения DialogBar и идентификаторы органов управления диалоговой панели IDD_DIALOG_BAR определены в файле resource.h. Этот файл создается автоматически редактором ресурсов Microsoft Visual C++. Исходный текст файла представлен в листинге 3.12.

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


//{{NO_DEPENDENCIES}}
// Microsoft Developer Studio generated include file.
// Used by DialogBar.rc
//
#define IDD_DIALOG_BAR                  101
#define IDC_RADIO_LEFT                  1004
#define IDC_RADIO_CENTER                1005
#define IDC_RADIO_RIGHT                 1006
#define IDC_BUTTON_SET                  1007
#define IDC_BUTTON_CLEAR                1008
#define IDC_COMBO_COLOUR                1012

// Next default values for new objects
// 
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE        104
#define _APS_NEXT_COMMAND_VALUE         40001
#define _APS_NEXT_CONTROL_VALUE         1014
#define _APS_NEXT_SYMED_VALUE           101
#endif
#endif

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

Рис. 3.19. Приложение DialogBar

Поработайте с приложением DialogBar. Если вы будете нажимать на кнопки диалоговой панели управления, изменять положение переключателя или выбирать новые строки из списка combo-box, то на экране будут появляться короткие сообщения, описывающие выбранный орган управления.

Как работает приложение DialogBar

В приложении DialogBar определены всего только два класса - это главный класс приложения CDlgBarApp и класс главного окна приложения CDlgBarWindow. Как и во многих других приложениях, посвященных использованию панелей управления, главное окно приложения по сути является его единственным окном. Однако мы сохранили за ним это почетное название, чтобы внести однообразие в описание приложений, созданных с использованием MFC AppWizard и без него.

Главный класс приложения CDlgBarApp

Главный класс приложения CDlgBarApp наследуется от базового класса CWinApp. Объект DlgBarApp класса CDlgBarApp объявлен как глобальный и создается сразу после запуска приложения.

В класс CDlgBarApp входит только метод InitInstance. Он создает главное окно приложения, представленное классом CDlgBarWindow, наследованным от класса CFrameWnd. Мы не станем подробно рассматривать этот метод, так как он фактически идентичен одноименному методу приложений Bar и MultiBar, представленных выше.

Класс главного окна приложения CDlgBarWindow

Класс CDlgBarWindow управляет главным окном приложения, создает диалоговую панель управления, а также обрабатывает сообщения, поступающие от диалоговой панели управления:


class CDlgBarWindow : public CFrameWnd
{
// Определяем панель управления
protected: 
   // Панель управления на основе класса CDialogBar       
   CDialogBar       m_wndDialogBar;
   
protected:
   // Метод OnCreate используется для создания диалоговой 
   // панели управления
   afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);

public:
   // Объявляем конструктор класса CDlgBarWindow
   CDlgBarWindow();

   // Объявляем методы для обработки команд от диалоговой 
   // панелей управления
   afx_msg BOOL DlgBarCommand(UINT nID);
   afx_msg void DlgBarCombo();
   
   // Макрокоманда необходима, так как класс 
   // CDlgBarWindow обрабатывает сообщения
   DECLARE_MESSAGE_MAP()    
}; 

Кроме ряда методов, в класс CDlgBarWindow входит элемент m_wndDialogBar класса CDialogBar. Этот элемент представляет диалоговую панель управления, которая будет отображаться в главном окне приложения.

Рассмотрим отдельные методы класса CDlgBarWindow более подробно.

Сейчас для нас наиболее важен метод OnCreate, который собственно, и создает диалоговую панель управления приложения DialogBar. В таблице сообщений класса CDlgBarWindow, находится макрокоманда ON_WM_CREATE. Поэтому в процессе создания главного окна приложения вызывается метод OnCreate.

Конструктор класса CDlgBarWindow

Конструктор класса CDlgBarWindow используется для создания главного окна приложения. Мы рассказывали о процедуре создания главного окна приложения в томе 24 серии “Библиотека системного программиста”, посвященном библиотеке MFC, поэтому сейчас не будем на нем останавливаться более подробно.

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

Таблица сообщений класса CDlgBarWindow обрабатывает сообщения от диалоговой панели управления. В ней также располагается макрокоманда ON_WM_CREATE, которая вызывает метод OnCreate во время создания окна:


ON_WM_CREATE()

Когда пользователь работает с диалоговой панелью управления, в ее родительское окно поступают сообщения. От кнопок Set и Clear и переключателя Alighn поступают командные сообщения, которые обрабатываются при помощи макрокоманд ON_COMMAND_EX:


// Командные сообщения от кнопок Set и Clear
ON_COMMAND_EX(IDC_BUTTON_SET, DlgBarCommand)
ON_COMMAND_EX(IDC_BUTTON_CLEAR, DlgBarCommand)
ON_COMMAND_EX(IDC_CHECK1, DlgBarCommand)

// Командные сообщения от переключателя Alighn 
ON_COMMAND_EX(IDC_RADIO_LEFT, DlgBarCommand)
ON_COMMAND_EX(IDC_RADIO_CENTER, DlgBarCommand)
ON_COMMAND_EX(IDC_RADIO_RIGHT, DlgBarCommand)

Для обработки всех этих командных сообщений вызывается один и тот же метод DlgBarCommand, которому передается идентификатор кнопки или переключателя, вызвавшего сообщение.

От списка combo-box, расположенного в диалоговой панели управления, мы обрабатываем только одно сообщение с кодом извещения CBN_SELCHANGE. Это сообщение передается, когда пользователь выбирает из списка новую строку:


// Командные сообщения от списка combo-box
ON_CBN_SELCHANGE( IDC_COMBO_COLOUR, DlgBarCombo)
Метод OnCreate класса CDlgBarWindow

Метод OnCreate класса CDlgBarWindow сначала вызывает метод OnCreate базового класса CFrameWnd:


if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
   return -1;

Затем мы создаем диалоговую панель управления. Для этого вызываем метод Create для объекта m_wndDialogBar, входящего в класс CDlgBarWindow, и представляющего панель управления:


if (!m_wndDialogBar.Create(this, IDD_DIALOG_BAR,
   CBRS_TOP|CBRS_TOOLTIPS, 
   IDD_DIALOG_BAR))
   {
      TRACE0("Failed to create dialog bar\n");
      return -1;      
   }
   return 0;
}

В качестве родительского окна для диалоговой панели управления мы указываем главное окно приложения. Ключевое слово this представляет указатель на текущий объект, то есть, в данном случае, окно CDlgBarWindow.

Второй параметр метода указывает идентификатор шаблона диалоговой панели, которая будет отображаться как диалоговая панель управления приложения. Мы указали идентификатор шаблона диалоговой панели IDD_DIALOG_BAR.

В качестве третьего параметра метода Create мы привели стиль CBRS_TOP. Стиль CBRS_TOP устанавливает расположение диалоговой панели управления в верхней части окна приложения.

Метод DlgBarCombo класса CDlgBarWindow

Когда пользователь выбирает строку из списка combo-box в диалоговой панели управления, в ее родительское окно, которое в нашем случае является главным окном приложения, поступает сообщение. Для его обработки вызывается метод DlgBarCombo класса CDlgBarWindow.

Метод DlgBarCombo выводит на экран сообщение о том, что пользователь сделал выбор из списка combo-box:


void CDlgBarWindow::DlgBarCombo()
{
   // Отображаем сообщение о том, что сделан выбор из списка 
   MessageBox("Combo-box selection changed");
}
Метод BarCommand класса CDlgBarWindow

Командные сообщения от кнопок Set, Clear, и переключателя Alighn обрабатываются методом BarCommand класса CDlgBarWindow. В качестве параметра nID методу BarCommand передается идентификатор вызвавшего его органа управления:


BOOL CDlgBarWindow::DlgBarCommand(UINT nID)
{
   //...
}

В приложении мы определили для кнопок Set, Clear, и переключателей группы Alighn, описывающие их строковые ресурсы, которые имеют точно такие же идентификаторы. Поэтому когда вызывается метод DlgBarCommand и ему передается идентификатор кнопки или переключателя, мы загружаем строковый ресурс, который имеет точно такой же идентификатор и отображаем его на экране:


if(szCommandAbout.LoadString(nID))
   MessageBox(szCommandAbout);
else 
{
   // Ошибка при загрузке строкового ресурса
   TRACE0("Failed to load string\n");
   return -1;      
}

Диалоговая панель управления и MFC AppWizard

Если вам надо добавить панель управления к приложению, созданному с использованием средств MFC AppWizard, вы должны выполнить точно такие же действия, какие были нами описаны в предыдущих разделах. Сначала надо создать шаблон диалоговой панели, затем добавить к классу окна, в котором будет отображаться диалоговая панель управления, элемент класса CDialogBar, и наконец, создать диалоговую панель управления, вызвав соответствующий метод Create.

Наибольший интерес представляет использование ClassWizard для добавления обработчиков сообщений от диалоговой панели управления. Откройте в редакторе ресурсов шаблон диалоговой панели управления и запустите ClassWizard.

ClassWizard обнаружит новый ресурс и предложит создать или выбрать для него управляющий класс (рис. 3.20). Сообщения от диалоговой панели управления передаются для обработки в ее родительское окно. Поэтому в качестве управляющего класса надо выбрать класс этого окна. Так как в большинстве случаев в качестве родительского окна для панелей управления, в том числе и для диалоговой панели управления, выступает главное окно приложения, надо выбрать класс CMainFrame.

Рис. 3.20. Диалоговая панель Adding a Class

Переведите переключатель диалоговой панели Adding a Class в положение Select an existing class и нажмите на кнопку OK. На экране появится диалоговая панель Select Class, содержащая список классов, определенных в приложении (рис. 3.21).

Рис. 3.21. Диалоговая панель Select Class

Выберите из списка Class list класс главного окна приложения CMainFrame и нажмите на кнопку Select. ClassWizard сообщит о том, что выбранный класс CMainFrame не относится к классам, которые предназначены для управления диалоговыми панелями (рис. 3.22). Для продолжения нажмите на кнопку Yes.

Рис. 3.22. Предупреждение

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

Как создать панель управления во время работы приложения

Во всех примерах, которые мы привели выше, для создания панели управления мы вызывали метод Create класса CToolBar во время создания окна приложения. В принципе, панель управления можно создать и позже, когда окно уже отображается на экране.

Возьмите приложение Bar. Добавьте к нему меню Tools, состоящее из одной строки Show Bar. Определите метод OnShowBar, который будет вызываться для обработки команд от этой строки меню. Не забудьте вставить в таблицу сообщений класса окна соответствующую макрокоманду.

Перенесите код для создания панели управления из метода OnCreate в метод OnShowBar. Теперь панель управления будет создаваться только после того, как вы выберите из меню Tools строку Show Bar.

Постройте проект и запустите приложение. Вы заметите, что панель управления почему-то возникает не сразу после выбора строки Show Bar. Чтобы панель управления появилась, необходимо еще изменить размер окна приложения.

Оказывается, метод Create класса CToolBar устанавливает нулевой размер окна панели управления. Настоящий размер панели управления выбирается позже, в зависимости от ее характеристик, а также размеров и характеристик родительского окна.

Чтобы установить правильные размеры и расположение панели управления следует вызвать метод RecalcLayout. Метод RecalcLayout входит в класс CFrameWnd и вызывается автоматически, если вы используете методы CFrameWnd::ShowControlBar, CFrameWnd::OnIdleUpdateCmdUI, CFrameWnd::OnSize, CFrameWnd::FloatControlBar, CMDIChildWnd::Create, а также некоторые другие.

[Назад] [Содеожание] [Дальше]