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, а также некоторые другие. |