Дополнительные возможности панели управления
Панель управления, созданная на основе класса CToolBar, состоит из одних только кнопок или разделителей. Стандартные средства для отображения в ней других элементов управления отсутствуют.
Однако, так как панель управления является не чем иным, как дочерним окном, можно самостоятельно разместить в нем другие элементы управления. Для этого предполагается сделать следующие шаги:
В том месте ресурса панели управления TOOLBAR, где предполагается вставить дополнительный орган управления, следует вставить разделитель SEPARATOR.
Сразу после создания панели управления необходимо изменить размер разделителя, вместо которого надо вставить другой элемент управления, и присвоить ему другой идентификатор.
Создать на месте разделителя нужный элемент управления, указав для него в качестве родительского окна идентификатор панели управления.
В класс CToolBar входит метод SetButtonInfo. Этот метод позволяет изменить внешний вид панели управления. Используя этот метод, можно изменить идентификатор, изображение, режим работы и размер разделителей кнопок панели управления. Для определения текущих характеристик кнопок панели можно воспользоваться методом GetButtonInfo класса CToolBar.
Когда на панели создается дополнительный элемент управления, то необходимо указать координаты прямоугольной области, которую он будет занимать. Для определения этих координат следует воспользоваться методом GetItemRect класса CToolBar. Вызов этого метода заполняет структуру типа RECT координатами прямоугольной области, занимаемой кнопкой или разделителем, с индексом nIndex.
Рассмотрим пример создания панели управления с дополнительными элементами - полем редактирования и выпадающим списком. Предварительно создадим два новых идентификатора ID_EDIT и ID_COMBO:
#define ID_EDIT 101 #define ID_COMBO 102
Затем необходимо создать новый класс панелей управления на базе класса CToolBar библиотеки MFC:
class CExtendedBar : public CToolBar { public: // дополнительные элементы управления CEdit m_edit; CComboBox m_combo; };
Далее в классе главного окна приложения следует объявить объект этого нового класса:
class CMainFrame : public CMDIFrameWnd { protected: CExtendedBar m_wndToolBar; // расширенная панель управления // другие описания класса .....…. };
Затем создаем панель управления и добавляем в нее дополнительные элементы при обработке сообщения WM_CREATE для главного окна приложения:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { // вызов метода базового класса для корректного создания окна if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1) return -1;
// разрешить присоединение панелей ко всем сторонам окна EnableDocking(CBRS_ALIGN_ANY);
// создание панели управления if (!m_wndToolBar.Create(this) !m_wndToolBar.LoadToolBar(IDR_MAINFRAME)) return -1;
// увеличим размер первого разделителя (его индекс 3) m_wndToolBar.SetButtonInfo(3,ID_EDIT,TBBS_SEPARATOR,130); // определяем координаты области, занимаемой разделителем CRect rEdit; m_wndToolBar.GetItemRect(3,&rEdit); rEdit.left+=6; rEdit.right-=6; // отступы
// создаем и размещаем однострочный редактор текста if(!(m_wndToolBar.m_edit.Create(WS_CHILD| ES_AUTOHSCROLL|WS_VISIBLE|WS_TABSTOP| WS_BORDER,rEdit,&m_wndToolBar,ID_EDIT))) return -1; // вводим ограничение на количество вводимых символов m_wndToolBar.m_edit.SetLimitText(10);
// увеличим размер второго разделителя (его индекс 7) m_wndToolBar.SetButtonInfo(7,ID_COMBO,TBBS_SEPARATOR,130); // определяем координаты области, занимаемой разделителем CRect rCombo; m_wndToolBar.GetItemRect(7,&rCombo); rCombo.left+=6; rCombo.right-=6; // отступы rCombo.bottom+=60; // для списка пунктов
// создаем и размещаем выпадающий список if(!(m_wndToolBar.m_combo.Create(WS_CHILD| CBS_DROPDOWNLIST|WS_VISIBLE|WS_TABSTOP, rCombo,&m_wndToolBar,ID_COMBO))) return -1; // добавляем строки в список m_wndToolBar.m_combo.AddString("First"); m_wndToolBar.m_combo.AddString("Second"); m_wndToolBar.m_combo.AddString("Third"); // отмечаем в списке первый пункт m_wndToolBar.m_combo.SetCurSel(0);
// установить характеристики панели управления m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);
// разрешить присоединить панель к любой строке родительского окна m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
// присоединить панель управления к родительскому окну DockControlBar(&m_wndToolBar);
// создание панели состояния (процесс создания рассматривается ниже) ……… return 0; }
Теперь добавим в класс главного окна приложения обработку сообщения WM_COMMAND. Эту обработку будет осуществлять метод OnCommand:
BOOL CMainFrame::OnCommand(WPARAM wParam, LPARAM lParam) { char str[80]; if(LOWORD(wParam)==ID_COMBO // сообщение от списка &&HIWORD(wParam)==CBN_SELCHANGE) { sprintf(str,"Item's number:%d",m_wndToolBar.m_combo.GetCurSel()); MessageBox(str); } if(LOWORD(wParam)==ID_EDIT // сообщение от поля ввода &&HIWORD(wParam)==EN_MAXTEXT) { sprintf(str,"Limit text:%d",m_wndToolBar.m_edit.GetLimitText()); MessageBox(str); } return CMDIFrameWnd::OnCommand(wParam, lParam); }
Содержание раздела