|
|
Компонент BRCSelWin ActiveX
Авторы: Попов А. Ю. Гусев А. А.
Опубликовано: 10.07.2003 Версия текста: 1.0
Скачать компонент BRCSelWin  Скачать тестовое приложение 

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;
BOOL bFound = FALSE;
long i, nCount, nRes;
CComboBox* pBox = (CComboBox*)GetDlgItem(IDC_COMBO1);
pBox->GetWindowText(strPath);
nCount = pBox->GetCount();
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;
}
if ( !bFound )
{
pBox->SetCurSel(pBox->AddString(strPath));
}
}
|
Формат конфигурационных файлов
Конфигурационный файл представляет из себя XML-файл, синтаксис которого представлен ниже:
<?xml version="1.0" encoding="UTF-8"?>
<Organization>
<DataSet>
<DataGroup Name="Ax. Sp." Icon="Configbitmap1.bmp" DataGroupFile="ConfigAxSp.xml"/>
<DataGroup Name="Channels" Icon="Configbitmap2.bmp" DataGroupFile="ConfigChan.xml"/>
<DataGroup Name="NcConf" Icon="Configbitmap3.bmp" DataGroupFile="ConfigNcConf.xml"/>
<DataGroup Name="NcProg" Icon="Configbitmap1.bmp" DataGroupFile="ConfigNcProg.xml"/>
<DataGroup Name="SercCom" Icon="Configbitmap2.bmp" DataGroupFile="ConfigSercCom.xml"/>
<DataGroup Name="Turn" Icon="Configbitmap3.bmp" DataGroupFile="ConfigTurn.xml"/>
</DataSet>
</Organization> |
Внутри тэга DataSet указываются все параметры, задающие кнопки. Непосредственно для задания кнопки используется тэг DataGroupName, который имеет следующие атрибуты:
Атрибут Name задает название кнопки;
Атрибут Icon задает путь к картинке формата *.bmp размером 32x32 пикселя, определяющей иконку кнопки;
Атрибут DataGroupFile определяет путь к файлу, который будет возвращаться при вызове функции
GetDataSetFile(long nIndex); |
Свойства и методы компонента BRCSelWin
- Изменять конфигурацию панели можно на лету в процессе выполнения приложения с помощью вызова метода:
long LoadConfig(BSTR 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 CSelWinTestDlg::OnRadioType()
{
m_SelWin.SetBarType(0);
}
void CSelWinTestDlg::OnRadioType2()
{
m_SelWin.SetBarType(1);
}
void CSelWinTestDlg::OnRadioType3()
{
m_SelWin.SetBarType(2);
} |
void SetRadioCheck(long nIndex); |
где nIndex задает активную на панели кнопку.
- Если Вы хотите очистить панель, то используйте метод:
- Для добавления кнопок к загруженной панели, или для создания новой панели необходимо использовать метод AddButton:
long AddButton(LPCTSTR strCaption, LPCTSTR strBitmap);
|
В нашем тестовом приложении для добавления кнопок в панель существует поле для задания названия кнопки и выпадающий список для задания пути к иконке, а так же кнопка, обрабатывающая эти два параметра и добавляющая новую кнопку в панель:
void CSelWinTestDlg::OnCmdAddButton()
{
CString strPath, strTemp, strCaption;
BOOL bFound = FALSE;
long i, nCount, nRes;
CComboBox* pBox = (CComboBox*)GetDlgItem(IDC_COMBO2);
pBox->GetWindowText(strPath);
nCount = pBox->GetCount();
for ( i=0; i<nCount; i++ )
{
pBox->GetLBText(i, strTemp);
if ( strPath == strTemp )
{
bFound = TRUE;
pBox->SetCurSel(i);
break;
}
}
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;
}
if ( !bFound )
{
pBox->SetCurSel(pBox->AddString(strPath));
}
} |
- ActiveX объект BRCSelWinCtrl возвращает событие:
void ButtonClick(long nIndex); |
где nIndex - номер нажатой кнопки, начиная с 0. Далее по этому номеру возможно получить значение поля DataGroupFile конфигурационного файла:
BSTR GetDataSetFile(long nIndex);
|
В качестве примера в нашем приложении при наступлении события
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);
} |
|
Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав.
| |