| Стоит Windows 8 Pro, Visual Studio 2010 Express Edition . |
Однодокументный интерфейс MFC
Создание комбинированного списка на панели инструментов
Прежде всего создадим идентификатор ID, который далее при создании списка программно система свяжет с самим списком и далее под этим ID будет учитывать этот список во всех других функциях управления списком.
-
Выберите вкладку Resource View и через контекстное меню выполните опцию Resource Symbols (Символы ресурсов). Появится окно
-
Нажмите кнопку New..., появится окно New Symbol, в котором в поле Name введите идентификатор IDC_CBWIDTH, а поле Value оставьте по умолчанию
Для программной поддержки комбинированного списка создадим переменную m_ctrlWidth типа CComboBox как член класса CMainFrame. Для этого:
-
Во вкладке Clas View выделите класс CMainFrame и через контекстное меню вызовите мастер Add Variable, который заполните так
-
Убедитесь в том, что мастер добавил переменную именно в класс CMainFrame файла MainFrm.h
Далее нам нужно будет выполнить такие действия:
- Установить ширину и идентификатор ID заглушки-заполнителя комбинированного списка на панели инструментов равными соответственно ширине и идентификатору ID самого комбинированного списка
- Определить размер и позицию комбинированного списка, получив для этого параметры заглушки-заполнителя на панели инструментов
- Создать комбинированный список как программный объект, указав при этом панель инструментов в качестве его родительского окна
- Загрузить текстовые строки в комбинированный список и установить индекс видимой начальной строки
Чтобы упорядочить этот процесс и не захламлять функцию OnCreate() класса фреймового окна CMainFrame не свойственным ей кодом, создадим отдельную функцию-член фрейма, а в функции OnCreate() разместим вызов этой вспомогательной упаковки кода. Вспомогательную функцию назовем CreateColorBar().
-
Выделите во вкладке Class View класс CMainFrame
-
Вызовите мастер Add Function, который заполните так
-
Перенесите (это значит полностью уберите со старого места!!!) соответствующий код из функции OnCreate() файла MainFrm.cpp в эту новую функцию (файл тот же!), а также добавьте новый код для создания комбинированного списка
Ниже приведен листинг функции, где красным выделен перенесенный код, а синим - добавленный новый код
Вспомогательная функция в файле MainFrm.cpp
// Вспомогательная упаковка кода создания панели инструментов
bool CMainFrame::CreateColorBar(void)
{
// Создать инструментальную панель
// для выбора цвета и настроить ее
if (!m_wndColorBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndColorBar.LoadToolBar(IDR_TBCOLOR))
{
TRACE0("Failed to create toolbar\n");
return FALSE; // fail to create
}
// Найти кнопку ID_COLOR_BLACK на инструментальной панели
int iTBCtrlID = m_wndColorBar.CommandToIndex(ID_COLOR_BLACK);
if(iTBCtrlID >= 0){
// Установить все кнопки так, чтобы
// они действовали как радиокнопки в группе
for(int i = iTBCtrlID; i < (iTBCtrlID + 8); i++)
m_wndColorBar.SetButtonStyle(i, TBBS_CHECKGROUP);
}
// Добавить комбинированный список
int nWidth = 100;
int nHeight = 125;
// Выбрать конфигурацию заглушки-заполнителя комбинированного списка
m_wndColorBar.SetButtonInfo(9, IDC_CBWIDTH, TBBS_SEPARATOR, nWidth);
// Получить высоту панели инструментов выбора цвета
CRect rect;
m_wndColorBar.GetItemRect(9, &rect);
rect.bottom = rect.top + nHeight;
// Создать комбинированный список
m_ctrlWidth.Create(WS_CHILD | WS_VISIBLE | WS_VSCROLL | CBS_DROPDOWNLIST
,rect, &m_wndColorBar, IDC_CBWIDTH);
// Заполнить комбинированный список текстами из ресурса String Table
CString str;
UINT id = IDS_WIDTH_1; // Важно, что значения идентификаторов
// расположены в порядке возрастания с шагом 1,
// поэтому можно организовать цикл
for(; id - IDS_WIDTH_1 < 11; id++) // Перебираем 11 элементов
if(str.LoadString(id))
m_ctrlWidth.AddString((LPCTSTR)str);
// Устанавливаем первый элемент видимым
m_ctrlWidth.SetCurSel(0);
return TRUE;
}В приведенном коде используется функция
// Выбрать конфигурацию заглушки-заполнителя комбинированного списка m_wndColorBar.SetButtonInfo(9, IDC_CBWIDTH, TBBS_SEPARATOR, nWidth);
Первый параметр (9) - означает индекс размещаемого в панели элемента ( начинается с нуля ). Этим модифицируемым элементом-заглушкой будет ранее введенный нами последний сепаратор в файле ресурсов. Фрагмент файла ресурсов таков
Идентификаторы элементов строки состояния в файле ресурсов
/////////////////////////////////////////////////////////////////////////////
//
// Toolbar
//
IDR_TBCOLOR TOOLBAR 16, 15
BEGIN
BUTTON ID_COLOR_BLACK
BUTTON ID_COLOR_BLUE
BUTTON ID_COLOR_GREEN
BUTTON ID_COLOR_CYAN
BUTTON ID_COLOR_RED
BUTTON ID_COLOR_MAGENTA
BUTTON ID_COLOR_YELLOW
BUTTON ID_COLOR_WHITE
SEPARATOR
SEPARATOR // заглушка-заполнитель как элемент с индексом 9
ENDВторой параметр - идентификатор ресурса комбинированного списка, для которого резервируется место на панели и за которым в дальнейшем функция Create() закрепит комбинированный список как приемник сообщений.
Третий параметр - стандартная константа TBBS_SEPARATOR библиотеки MFC, представляющая разделитель панели инструментов.
Четвертый аргумент - ширина заглушки-заполнителя для резервируемого места под комбинированный список.
-
Вновь дополните функцию CMainFrame::OnCreate() кодом вызова только что созданной упаковки CMainFrame::CreateColorBar(), после чего функция должна выглядеть такВызов вспомогательной функции из OnCreate() int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1; if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || !m_wndToolBar.LoadToolBar(IDR_MAINFRAME)) { TRACE0("Failed to create toolbar\n"); return -1; // fail to create } // Добавить инструментальную панель выбора цвета // вместе с комбинированным списком выбора толщины пера if(!CreateColorBar()){ TRACE0("Failed to create color toolbar\n"); return -1; } if (!m_wndStatusBar.Create(this) || !m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT))) { TRACE0("Failed to create status bar\n"); return -1; // fail to create } m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); m_wndColorBar.EnableDocking(CBRS_ALIGN_ANY);// Наша!!! EnableDocking(CBRS_ALIGN_ANY); DockControlBar(&m_wndToolBar); DockControlBar(&m_wndColorBar);// Наша!!! return 0; } -
Постройте приложение и убедитесь, что список раскрывается, но ничего пока не делает
Мы создали комбинированный список как немодальное окно с помощью функции Create, которая выглядит так
Функция Create в файле MainFrm.cpp
// Вспомогательная упаковка кода создания панели инструментов
bool CMainFrame::CreateColorBar(void)
{
...............................................................
// Создать комбинированный список
m_ctrlWidth.Create(WS_CHILD | WS_VISIBLE | WS_VSCROLL | CBS_DROPDOWNLIST
,rect, &m_wndColorBar, IDC_CBWIDTH);
.......................................................................
return TRUE;
}Первым аргументом этой функции является сочетание стилей комбинированного списка, определяющих его внешние свойства и поведение. Часть флажков относятся к оконным стилям WS_ (window style) , поскольку комбинированный список наследует класс CWnd, а часть флажков специфицирует стиль только списка ( CBS_ - ComboBox Style ). Перечислим значения флажков стилей списка
| Стили комбинированного списка | |
|---|---|
| Стиль | Описание |
| WS_CHILD | Указывает, что данное окно является дочерним (обязательный стиль) |
| WS_VISIBLE | Делает комбинированный список изначально видимым |
| WS_DISABLED | Отключает комбинированный список |
| WS_VSCROLL | Добавляет вертикальную прокрутку к раскрывающемуся списку |
| WS_HSCROLL | Добавляет горизонтальную прокрутку к раскрывающемуся списку |
| WS_GROUP | Группирует элементы управления |
| WS_TABSTOP | Включает комбинированный список в последовательность перехода по клавише Tab |
| CBS_AUTOHSCROLL | Обеспечивает прокрутку текста в поле редактирования при его заполнении |
| CBS_DROPDOWN | Подобен стилю CBS_SIMPLE, но не отображает список до тех пор, пока пользователь не выберет пиктограмму, следующую за полем редактирования |
| CBS_DROPDOWNLIST | Подобен стилю CBS_DROPDOWN. Однако заменяет поле редактирования статическим текстом, который отображает текущее выбранное значение элемента списка |
| CBS_HASSTRINGS | Указывает, что за перерисовку комбинированного списка отвечает владелец. Элементы в окне списка состоят из строк |
| CBS_OEMCONVERT | Текст, выводимый для отображения на экране в поле редактирования, конвертируется из набора символов ASCII в набор OEM, а затем, при передаче данных из комбинированного списка в программу - опять из набора OEM в набор символов ASCII. Набор отображаемых символов ASCII используется в MS-DOS, а OEM - в Windows. Символы с кодами 32-127 обычно совпадают в обеих системах. Другие же символы, используемые национальными кодировками, требуют конвертации. Для правильного отображения текста на экране в консольном режиме для этого используется функция CharToOem(char* strASCII, char* strOEM) |
| CBS_OWNERDRAWFIXED | Указывает, что владелец списка отвечает за перерисовку содержимого. Содержимое списка имеет фиксированную высоту |
| CBS_OWNERDRAWVARIABLE | Указывает, что владелец списка отвечает за перерисовку содержимого. Высота содержимого списка может изменяться |
| CBS_SIMPLE | Все время отображает список на экране |
| CBS_SORT | Автоматически сортирует строки в списке |
| CBS_DISABLENOSCROLL | Если список не содержит достаточно элементов для прокрутки, все равно отображается полоса прокрутки, хоть и в отключенном ( Disabled ) виде |
| CBS_NOINTEGRALHEIGHT | Указывает, что комбинированный список имеет точно указанный размер |



