Глава 17. Диалоговая панель управления
Если в панели управления приложения необходимо разместить много разнообразных элементов управления, то значительно удобнее создать эту панель на основе другого класса - класса
CDialogBar . Этот класс, так же как и класс CToolBar , наследован от базового класса CControlBar .Класс
CDialogBar позволяет создать диалоговую панель управления на основе шаблона диалоговой панели. В отличие от обычной диалоговой панели диалоговая панель управления, созданная на основе класса CDialogBar , имеет все свойства панели управления. Она может быть присоединена к одной из границ окна или может отображаться в отдельном мини-окне.Приложение может иметь несколько панелей управления, созданных на основе классов
CToolBar и CDialogBar .Методы класса диалоговой панели управления
Непосредственно в состав класса
CDialogBar входят всего два метода - конструктор класса и метод Create .Конструктор класса только создает соответствующий объект, но не саму панель управления. Чтобы создать панель управления, следует вызвать метод
Create и указать ему шаблон диалоговой панели, используемый для создания диалоговой панели.Метод Create имеет два различных формата:
BOOL Create( CWnd* pParentWnd, LPCTSTR lpszTemplateName, UINT nStyle, UINT nID ); BOOL Create( CWnd* pParentWnd, UINT nIDTemplate, UINT nStyle, UINT nID );
Первый параметр задает окно, для которого создается диалоговая панель управления. Обычно в качестве такого окна выступает главное окно приложения.
Второй параметр указывает шаблон панели управления. В зависимости от того, как ресурс панели определен в ресурсах приложения, указывается либо идентификатор, либо имя ресурса.
Третий параметр определяет начальное положение панели управления в окне приложения. Можно использовать следующие флаги: CBRS_TOP, CBRS_BOTTOM, CBRS_LEFT, CBRS_RIGHT.
Последний параметр определяет идентификатор диалоговой панели управления.
Создание диалоговой панели управлени я
Как и в случае разработки диалоговых панелей, сначала следует подготовить шаблон диалоговой панели, которая будет использоваться как основа панели управления. В шаблоне диалоговой панели следует установить только один стиль WS_CHILD - диалоговая панель будет выступать в качестве дочернего окна и не должна иметь ни заголовка, ни рамки. Готовый шаблон следует сохранить в файле ресурсов, например, с идентификатором ресурса IDD_DIALOGBAR.
В состав класса окна, в котором будет отображаться диалоговая панель управления, надо включить элемент данных класса
CDialogBar . Этот элемент будет представлять диалоговую панель управления. Например:class CMainFrame : public CMDIFrameWnd { protected: CDialogBar m_wndDlgBar; // диалоговая панель управления // другие описания класса ....... };
Затем необходимо переопределить метод
OnCreate класса окна и добавить в него вызов метода Create класса CDialogBar для объекта, представляющего диалоговую панель управления.Для того, чтобы пользователь мог сам перемещать диалоговую панель управления с одной границы экрана на другую или разместить ее в отдельном окне, т.е. чтобы он мог управлять положением панели на экране, необходимо сделать действия, аналогичные действиям для панели управления класса
CToolBar .Обычно создание диалоговой панели управления и разрешение ее перемещения производят при обработке сообщения WM_CREATE для главного окна приложения, например:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { // вызов метода базового класса для корректного создания окна if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1) return -1; // разрешить присоединение панелей ко всем сторонам окна EnableDocking(CBRS_ALIGN_ANY); // создание диалоговой панели управления if(!m_wndDlgBar.Create(this,IDD_DIALOGBAR, CBRS_BOTTOM,IDD_DIALOGBAR)) return -1; // установить характеристики диалоговой панели управления m_wndDlgBar.SetBarStyle(m_wndDlgBar.GetBarStyle() | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC); // разрешить присоединить панель к любой строке родительского окна m_wndDlgBar.EnableDocking(CBRS_ALIGN_ANY); // присоединить диалоговую панель управления к родительскому окну DockControlBar(&m_wndDlgBar); // создание панели управления (процесс создания рассматривался выше) ……… // создание панели состояния (процесс создания рассматривается ниже) ……… return 0; }
Элементы управления диалоговой панели передают сообщения непосредственно своему родительскому окну. Поэтому следует добавить в таблицу класса окна соответствующие макрокоманды для получения сообщений и включить в класс окна методы для обработки этих сообщений.
Если диалоговая панель управления достаточно сложна и имеет много органов управления, то можно создать для нее отдельный класс на основе базового класса
CDialogBar (однако это способ не очень часто используется). Этот класс следует дополнить методами, обрабатывающими сообщения от элементов управления. Таким образом можно разгрузить таблицу сообщений главного окна приложения.