Образец CTRLBARS: демонстрация пользовательских панелей элементов управления
Обновлен: Ноябрь 2007
Образец CTRLBARS демонстрирует большое разнообразие возможностей настройки для панелей элементов управления.
Размещение нескольких панелей элементов управления в фрейме окна, выборочное скрытие и отображение панелей и динамическое изменение расположения элементов вдоль границы фрейма окна. Место для панелей элементов управления в фрейме окна выделяется в соответствии с Z-порядком, который изначально представляет порядок, в котором они создаются (см. описание метода CMainFrame::OnCreate). В образце CTRLBARS Z-порядок диалоговой панели изменяется с помощью функции CWnd::SetWindowPos. Панель элементов управления скрывается и отображается с помощью функции CWnd::ShowWindow. Когда в образце CTRLBARS изменяется Z-порядок либо скрывается или отображается панель элементов управления, после этого вызывается метод CFrameWnd::RecalcLayout, чтобы перераспределить площадь окна между панелями элементов управления, которые остаются видимыми.
Пользовательские панели инструментов, динамическое изменение позиций кнопок в панели инструментов и добавление элементов управления (например, полей со списком) на панель инструментов. В образце CTRLBARS показаны два способа настройки панели инструментов. Для первой панели инструментов с именем Tool Bar изменяется макет кнопок с краткого (5 вариант) до расширенного (10 кнопок). В образце CTRLBARS вызывается метод CToolBar::SetButtonInfo для каждой кнопки, чтобы сопоставить ее с позицией растрового изображения на изображении панели инструментов и с идентификатором команды. Для второй панели инструментов с именем Style Bar демонстрируется замена кнопки (или разделителя) на элемент управления — в этом примере на поле со списком. Метод CMainFrame::CreateStyleBar создает разделитель панели инструментов шириной в 100 точек. Затем он создает поле со списком (IDW_COMBO) как дочерний объект панели инструментов и задает позицию для поля со списком так, чтобы оно располагалось на месте, которое ранее было занято разделителем.
Пользовательская строка состояния, пользовательские индикаторы и отправка текста в заголовок сообщения. Платформа автоматически обновляет индикатор CAPS LOCK, NUM LOCK или SCROLL LOCK для строк состояния, если указать, например, ID_INDICATOR_CAPS в качестве одного из идентификаторов, передаваемых в массиве indicators[ ] в метод CStatusBar::SetIndicators. Образец CTRLBARS демонстрирует расширение стандартных индикаторов строки состояния, добавляя режим замены (OVR), который включается, когда пользователь нажимает клавишу INSERT. Для этого необходим обработчик событий для команды ID_TOGGLE_INSERT (который сопоставляется с клавишей VK_INSERT) и строка ресурсов (ID_INDICATOR_OVR), чтобы текст "OVR" отображался, когда активен режим замены. Идентификатор ресурса ID_INDICATOR_OVR является стандартной константой MFC.
Диалоговая панель, которая представляет панель элементов управления, для которой макет определяется шаблоном ресурсов диалогового окна. Как и для любой панели элементов управления, уведомления из элементов управления на диалоговой панели направляются владельцу диалоговой панели, то есть в фрейм главного окна. Например, метод CMainFrame::OnSelChangePalette служит обработчиком для уведомления CBN_SELCHANGE, получаемого от элемента управления "Поле со списком" на диалоговой панели. Класс CMainFrame также содержит обработчики для двух из трех флажков "Hide/Show" (Styles и Palette). Для третьего флажка (Hide/Show Toolbar) не нужно писать обработчик, поскольку для события ID_VIEW_TOOLBAR платформа предоставляет стандартный обработчик.
Плавающая палитра инструментов, которая работает аналогично панели инструментов, но представляет двумерный массив кнопок инструментов и размещается над фреймом родительского окна в качестве плавающего безрежимного окна. Плавающая палитра инструментов реализована в многократно используемом классе CPaletteBar, производном от класса CToolBar. В результате наследования от класса CToolBar класс CPaletteBar получает возможности для работы с кнопками панели инструментов. К специальным функциям палитры, реализованным в классе CPaletteBar, относятся следующие.
Плавающий стиль окна (WS_POPUP).
Двухмерное распределение кнопок инструментов по строкам и столбцам: создание, заливка и проверка нажатия кнопок.
Компактный заголовок окна (без текста).
Перемещение палитры с помощью отслеживающего прямоугольника.
Образец CTRLBARS также демонстрирует использование событий ON_COMMAND_EX и ON_UPDATE_COMMAND_UI_RANGE. Многие из вариантов настройки для панели элементов управления, показанные в образце CTRLBARS, обсуждаются в статье Технические заметки 31.
Примечание о безопасности. |
---|
Этот образец кода служит для демонстрации основных принципов и не предназначен для использования в приложениях или на веб-узлах, поскольку не может считаться примером наиболее безопасного кода. Корпорация Майкрософт не несет ответственности за случайные или косвенные убытки в случае использования образца кода не по назначению. |
Чтобы получить образцы и инструкции по их установке, выполните следующие действия.
В меню Справка среды Visual Studio выберите пункт Примеры.
Дополнительные сведения см. в разделе Поиск файлов примеров.
Самая последняя версия и полный список образцов доступны в Интернете на странице образцов Visual Studio 2008.
Кроме того, образцы находятся на жестком диске компьютера. По умолчанию образцы кода и файл Readme копируются в папку, находящуюся в папке \Program Files\Visual Studio 9.0\Samples\. Все образцы кода для экспресс-выпусков Visual Studio находятся в Интернете.
Построение и запуск образца
Построение и запуск образца CTRLBARS
Откройте решение Ctrlbars.sln.
В меню Построение выберите команду Построить.
В меню Отладка выберите пункт Запуск без отладки.
Во время первого запуска образца CTRLBARS все элементы управления являются видимыми.
Панель инструментов с 5 кнопками располагается непосредственно под строкой меню. Первая кнопка (жирная стрелка вверх) переключает макеты панели инструментов: краткий (5 кнопок) и расширенный (10 кнопок). Кнопки всегда остаются неактивными, за исключением первой кнопки Short/Long и кнопки Help, которая открывает окно About.
Вторая панель инструментов располагается непосредственно под первой. На этой панели инструментов, которая называется Style Bar, задается один из следующих стилей выравнивания текста: по левому краю, по центру, по правому краю или по ширине. Выбор одного из стилей влияет только на состояние панели Style Bar.
Строка состояния располагается в нижней части окна.
Плавающая палитра с массивом кнопок инструментов (3 на 4) располагается в верхней части окна.
Диалоговая панель находится у левой границы окна. Макет этой панели элементов управления определен в ресурсе шаблона диалогового окна (IDD_VIEW_SELECT), и поэтому она является диалоговой панелью.
Меню View позволяет скрыть или отобразить любые из первых четырех панелей элементов управления. Диалоговая панель всегда является видимой. Состояние отображения для панелей элементов управления Tools, Styles и Palette немедленно отражается на состоянии флажков Hide/Show диалоговой панели. Также можно скрыть или отобразить любую из других панелей элементов управления, установив или сняв соответствующий флажок.
Команда Dlg Bar Top из меню View позволяет изменить расположение панелей таким образом, чтобы диалоговая панель оказалась наверху Z-порядка панелей элементов управления. Когда диалоговая панель располагается наверху, она занимает всю левую границу окна за исключением строки меню и строки состояния. Левые края двух панелей инструментов касаются диалоговой панели. Когда диалоговая панель возвращается на исходную позицию в Z-порядке (после всех остальных панелей элементов управления), ее верхний край примыкает к нижнему краю второй панели инструментов, а ее нижний край — к верхнему краю строки состояния. Таким образом проявляется основной алгоритм, в котором площадь окна распределяется по принципу очереди (первым прибыл — первым обслужен).
Меню Style позволяет выбрать один из четырех стилей выравнивания текста — Left (по левому краю), Centered (по центру), Right (по правому краю) или Justified (по ширине). Выбранный стиль немедленно отразится в поле со списком Style Bar и на состоянии соответствующей кнопки. Как и в предыдущем случае, стиль можно выбрать в поле со списком Style Bar или нажатием одной из четырех кнопок. Новый выбор немедленно отражается на состоянии других элементов управления и в меню Style.
Меню Palette позволяет изменить расположение кнопок на палитре (с "3 на 4" на "2 на 6").
После выбора инструмента с палитры (Palette) в заголовке сообщения строки состояния выводится сообщение "You have selected the <тип> tool", где <тип> указывает на один из 12 инструментов, доступных для выбора. Этот выбор отражается в поле со списком на диалоговой панели. С помощью этого поля со списком также можно выбрать инструмент.
Помимо последнего выбранного элемента управления в строке состояния также выводится состояние трех клавиш — INS, CAPS LOCK и NUM LOCK.
Ключевые слова
В этом образце показаны следующие ключевые слова:
AfxFormatString1; AfxGetApp; AfxIsValidAddress; AfxRegisterWndClass; AfxThrowResourceException; BitBlt; CBrush::CreateSolidBrush; CCmdUI::ContinueRouting; CCmdUI::Enable; CCmdUI::SetCheck; CCmdUI::SetText; CComboBox::AddString; CComboBox::Create; CComboBox::GetCurSel; CComboBox::GetLBText; CComboBox::SetCurSel; CControlBar::GetBarStyle; CControlBar::SetBarStyle; CDC::Attach; CDC::Detach; CDC::PatBlt; CDC::RectVisible; CDialogBar::Create; CDumpContext::GetDepth; CFont::CreateFontIndirect; CFrameWnd::LoadFrame; CFrameWnd::RecalcLayout; CFrameWnd::SetMessageText; CGdiObject::Attach; CObject::AssertValid; CObject::Dump; CRect::Height; CRect::InflateRect; CRect::SetRectEmpty; CRect::Width; CStatusBar::Create; CStatusBar::GetPaneInfo; CStatusBar::SetIndicators; CStatusBar::SetPaneInfo; CString::LoadString; CToolBar::CToolBar; CToolBar::CommandToIndex; CToolBar::Create; CToolBar::GetButtonInfo; CToolBar::GetItemID; CToolBar::GetItemRect; CToolBar::LoadBitmap; CToolBar::SetButtonInfo; CToolBar::SetButtons; CToolBar::SetHeight; CToolBar::SetSizes; CWinApp::InitInstance; CWinApp::OnIdle; CWnd::ClientToScreen; CWnd::CreateEx; CWnd::GetCapture; CWnd::GetClientRect; CWnd::GetDC; CWnd::GetDlgItem; CWnd::GetOwner; CWnd::GetParentFrame; CWnd::GetSafeHwnd; CWnd::GetStyle; CWnd::GetWindowRect; CWnd::Invalidate; CWnd::InvalidateRect; CWnd::OnCancelMode; CWnd::OnCreate; CWnd::OnLButtonDown; CWnd::OnMouseActivate; CWnd::OnMouseMove; CWnd::OnSysColorChange; CWnd::PreCreateWindow; CWnd::ReleaseDC; CWnd::SendMessage; CWnd::SetCapture; CWnd::SetFont; CWnd::SetWindowPos; CWnd::ShowWindow; CWnd::UpdateDialogControls; CWnd::UpdateWindow; CreateBitmap; CreateCompatibleBitmap; CreateCompatibleDC; CreateDIBitmap; CreatePatternBrush; CreatePen; CreateSolidBrush; DeleteDC; DeleteObject; FillRect; FindResource; FrameRect; FreeResource; GetActiveWindow; GetBValue; GetCapture; GetDC; GetDeviceCaps; GetGValue; GetNextWindow; GetObjectType; GetParent; GetRValue; GetStockObject; GetSysColor; GetSystemMetrics; GetVersion; GetWindow; HIBYTE; InvertRect; LOBYTE; LoadCursor; LoadIcon; LoadResource; LockResource; MAKEINTRESOURCE; OffsetRect; PatBlt; RGB; ReleaseCapture; ReleaseDC; SelectObject; SendMessage; SetActiveWindow; SetBkColor; SetCapture; SetROP2; SetRect; SetTextColor; StretchDIBits; UpdateWindow; free; lstrcpy; malloc; memcpy; memset
Примечание. |
---|
Некоторые образцы, включая данный, не модифицировались с учетом изменений в мастерах, библиотеках и компиляторе Visual C++, однако по-прежнему демонстрируют выполнение требуемой задачи. |