BRCSelWinCtrl - это ActiveX компонент предоставляющий панель кнопок управления.
Количество кнопок на панели, иконки для них и их названия можно менять с помощью конфигурационных файлов. Компонент имеет 3 режима работы:
Набор кнопок без фиксации;
Набор кнопок с одной зафиксированной позицией (Radio Buttons);
Набор кнопок с независимой фиксацией (Check Buttons).
Пример использования ActiveX компонента BRCSelWinCtrl на базе диалогового приложения
В первую очередь необходимо зарегистрировать в системе BRCSelWinCtrl ActiveX (например, из командной строки: "regsvr32 BRCSelWin.ocx").
Затем добавим поддержку BRCSelWinCtrl в диалоговом приложении. Для этого необходимо:
Добавить элемент BRCSelWin Control в проект, для чего в меню Project выбрать пункт Add to Project и команду Components and Controls, далее в появившемся диалоговом окне выбрать папку Registered ActiveX Controls и найти в ней элемент BRCSelWin Control.
Найти на панели Controls объект BRCSelWin Control и перетащить его в необходимое место вашего диалогового окна.
Добавить переменную, которая отвечает за элемент управления, для чего в меню View вызвать команду Class Wizard, перейти на вкладку Member Variables и нажать кнопку Add Variable, убедившись, что в поле Class Name выбран класс CApplicationDlg. В новом диалоговом окне в поле Member Variable Name указать имя новой переменной.
Далее необходимо загрузить файл конфигурации для панели, представляющей собой наш элемент управления. В нашем тестовом приложении для этого используется кнопка "Load", которая использует для загрузки конфигурации путь, указанный в выпадающем списке:
void CSelWinTestDlg::OnCmdLoad()
{
CString strPath, strTemp;
// найти выбранный элемент в ComboBox
BOOL bFound = FALSE;
long i, nCount, nRes;
CComboBox* pBox = (CComboBox*)GetDlgItem(IDC_COMBO1);
pBox->GetWindowText(strPath);
nCount = pBox->GetCount(); // определяем сколько всего строк в ComboBox // ищем и выбираем необходимый элемент в ComboBox
for ( i=0; i<nCount; i++ )
{
pBox->GetLBText(i, strTemp);
if ( strPath == strTemp )
{
bFound = TRUE;
pBox->SetCurSel(i);
break;
}
}
// загружаем файл конфигурации
nRes = m_SelWin.LoadConfig(strPath);
// если возникла ошибка, то выдаем соответствующее собщение в поле сообщений
if ( nRes < 0 )
{
m_ListInfo.InsertString(0, "Ошибка открытия конфигурации");
return;
}
// если введен новый путь к файлу конфигурации, то добавляем его в ComboBox
if ( !bFound )
{
pBox->SetCurSel(pBox->AddString(strPath));
}
}
Формат конфигурационных файлов
Конфигурационный файл представляет из себя XML-файл, синтаксис которого представлен ниже:
Внутри тэга DataSet указываются все параметры, задающие кнопки. Непосредственно для задания кнопки используется тэг DataGroupName, который имеет следующие атрибуты:
Атрибут Name задает название кнопки;
Атрибут Icon задает путь к картинке формата *.bmp размером 32x32 пикселя, определяющей иконку кнопки;
Атрибут DataGroupFile определяет путь к файлу, который будет возвращаться при вызове функции
GetDataSetFile(long nIndex);
Свойства и методы компонента BRCSelWin
Изменять конфигурацию панели можно на лету в процессе выполнения приложения с помощью вызова метода:
long LoadConfig(BSTR strFilename);
// где strFileName - имя конфигурационного файла
Метод автоматически разберет конфигурационный XML-файл и перерисует кнопки на панели. В том случае, если Вы хотите использовать свой обработчик конфигурационных файлов (например, захотите использовать другой формат файлов, отличных от XML), то Вы можете использовать функцию:
long LoadConfigFromDoc(IDispatch* pDocument);
В этом случае DOM-документ передается компоненту с клиентской стороны, и ему нет необходимости его создавать самостоятельно, как при использовании метода
long LoadConfig(BSTR strFilename);
Для установки режима отображения панели используйте следующий метод:
void SetBarType(long nBarType);
nBarType может принимать значения 0, 1 или 2. В том случае, если nBarType задан равным 0, то используется набор кнопок без фиксации (тип Normal), если nBarType задан равным 1, то используется набор кнопок с фиксацией (тип Radio Button), если же nBarType задан равным 2, то используется набор кнопок с независимой фиксацией (тип Checkable). При смене состояние на Radio Button компонент автоматически выбирает кнопку с индексом 0, при переходе в остальные состояния компонент сбрасывает состояние кнопок.
Для задания режима отображения панели в нашем приложении мы используем три элемента Radio Button, которые служат для выбора необходимого режима:
В случае если Вы хотите задать активную по умолчанию кнопку, или изменить активную кнопку в процессе работы приложения, то используйте метод:
void SetRadioCheck(long nIndex);
где nIndex задает активную на панели кнопку.
Если Вы хотите очистить панель, то используйте метод:
void Clear();
Для добавления кнопок к загруженной панели, или для создания новой панели необходимо использовать метод AddButton:
long AddButton(LPCTSTR strCaption, LPCTSTR strBitmap);
// где strCaption - задает имя кнопки,
// strBitmap - путь к файлу, задающему иконку.
В нашем тестовом приложении для добавления кнопок в панель существует поле для задания названия кнопки и выпадающий список для задания пути к иконке, а так же кнопка, обрабатывающая эти два параметра и добавляющая новую кнопку в панель:
// найти выбранный элемент в ComboBox
BOOL bFound = FALSE;
long i, nCount, nRes;
CComboBox* pBox = (CComboBox*)GetDlgItem(IDC_COMBO2);
pBox->GetWindowText(strPath);
nCount = pBox->GetCount(); // определяем сколько всего строк,
// задающих путь к иконке в ComboBox // ищем необходимый элемент в ComboBox
for ( i=0; i<nCount; i++ )
{
pBox->GetLBText(i, strTemp);
if ( strPath == strTemp )
{
// если искомый элемент найден, то выбираем его в ComboBox
bFound = TRUE;
pBox->SetCurSel(i);
break;
}
}
// получаем значение поля Caption, задающий название для кнопки
CEdit* pEdit = (CEdit*)GetDlgItem(IDC_EDIT_CAPTION);
pEdit->GetWindowText(strCaption);
// добавляем кнопку в панель, в случае ошибки, выдаем сообщение о ней в поле
// сообщений
nRes = m_SelWin.AddButton(strCaption, strPath);
if ( nRes < 0 )
{
m_ListInfo.InsertString(0, "Ошибка AddButton");
return;
}
// если введен новый путь к иконке, то добавляем его в ComboBox
if ( !bFound )
{
pBox->SetCurSel(pBox->AddString(strPath));
}
}
ActiveX объект BRCSelWinCtrl возвращает событие:
void ButtonClick(long nIndex);
где nIndex - номер нажатой кнопки, начиная с 0. Далее по этому номеру возможно получить значение поля DataGroupFile конфигурационного файла:
BSTR GetDataSetFile(long nIndex);
// где nIndex - номер кнопки, для которой необходимо получить значение поля
// DataGroupFile
В качестве примера в нашем приложении при наступлении события
void ButtonClick(long nIndex);
выдается звуковой сигнал и добавляется сообщение "Событие: OnButtonClick(nIndex)" в поле сообщений, где nIndex представляет собой индекс нажатой кнопки:
void CSelWinTestDlg::OnButtonClickBrcselwinctrl1(long nIndex)
{
// выдача звукового сигнала
Beep(1000, 100);
// выдача сообщения в поле сообщений
CString strTemp;
strTemp.Format("Событие: OnButtonClick(%d)", nIndex);
m_ListInfo.InsertString(0, strTemp);
}
Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав.