Дерево и кнопки для MFC Grid
Control
Автор: Ken Bertelson
Описание
Этот пример показывает, как добавить в MFC Grid control
(наследованный от CWnd) такие элементы
управления как дерево и кнопки.
Пример наследует классы от CGridCellBase ,
который содержит в себе описание различных типов
ячеек. Теперь добавлены следующие типы ячеек:
- Ячейки которые рисуют дерево
- Ячейки, которые рисуют один или несколько
элементов управления
- Ячейки, которые рисуют дерево + элементы
управления
- Виртуальные ячейки - не содержащие данных
Работая с CGridCellBase , Вы можете создавать
различные виды эффектов не изменяя исходные
файлы MFC Grid. Пример позволяет наследовать новый
grid класс.
Как установить ячейки, отображающие дерево
Добавьте в заголовочный файл CDialog или CView:
// (файл .h)
CGridCtrl m_Grid; // сам грид
CTreeColumn m_TreeColumn; // поддержка колонок дерева
В CDialog или CView добавьте массив UCHAR-ов, который
определяет стандартные уровни дерева. 1=корень, 2=первая
ветвь корня и т.д.
// (файл .cpp file)
unsigned char ucPatternAry[] = { 1,2,3,4,4,5,5,3,3,4,2,3,4};
В CDialog или CView укажите информацию
о колонках, а затем используйте CTreeColumn::TreeSetup()
для определения расположений строчек. Для CDialog ,
это можно сделать в функции OnInitDialog() .
// (файл .cpp)
m_Grid.SetColumnCount( 4);
m_Grid.SetFixedColumnCount( 1);
m_TreeColumn.TreeSetup( &m_Grid, // grid
2, // колонка в которой дерево
sizeof( ucPatternAry), // кол-во строк в дереве
1, // Счётчик строк
ucPatternAry,// Массив уровней
TRUE, //показываем линии дерева(не grid)
// F=не показываем
TRUE); // используем первые 3 картинки из
// существующего списка картинок
Вы так же можете изменить существующую
структуру дерева, путём вызова из CTreeColumn функции InsertTreeBranch()
и DeleteTreeBranch() .
Установка ячеек, которые рисуют кнопки
Добавьте в заголовочный файл CDialog или CView
следующие строки:
// (файл .h)
CGridCtrl m_Grid; // сам
CBtnDataBase m_BtnDataBase; // берём общие свойства для кнопок
В .cpp файлы CDialog или CView.
// (файл .cpp)
m_BtnDataBase.SetGrid( &m_Grid);
Возможно Вам захочется использовать свойства
ячейки с кнопкой для всех кнопочных ячеек.
Это можно сделать только однажды.
// (файл .cpp)
// Сохраняем старые свойства ячейки
CGridBtnCell GridCellCopy;
GridCellCopy.SetBtnDataBase( &m_BtnDataBase);
CGridCellBase* pCurrCell = m_Grid.GetCell( row, col);
if (pCurrCell)
GridCellCopy = *pCurrCell; //данные сохранятся в m_BtnDataBase
После того, как окно грида создано, замените
стандартные ячейки ячейками с кнопками по Вашему
усмотрению. Следующий код вызывается в CDialog::OnInitDialog() .
// (файл .cpp)
m_Grid.SetCellType( row, col, RUNTIME_CLASS(CGridBtnCell) );
CGridBtnCell* pGridBtnCell = (CGridBtnCell*)m_Grid.GetCell(row,col);
// сообщаем новой ячейке - где лежат её свойства
pGridBtnCell->SetBtnDataBase( &m_BtnDataBase);
Пример показывает - как добавить в ячейку до 4-х
кнопок.
// (файл .cpp)
pGridBtnCell->SetupBtns(
0, // индекс картинки для рисования
DFC_BUTTON, // тип кнопки
DFCS_BUTTONPUSH, // на подобие nState в DrawFrameControl()
CGridBtnCellBase::CTL_ALIGN_CENTER,
// горизонтальное выравнивание картинки
0, // ширина, либо 0 для подстраивания под
// размер ячейки
FALSE, // T=кнопка входит в группу радиокнопок
"Btn Text" ); // Текст в кнопке; NULL - текста нет
|