Научно-исследовательская лаборатория систем ЧПУ
Научно-исследовательская лаборатория систем ЧПУ

Поиск по сайту:
 

Расписание курсов "Программирование SINUMERIK 810D/840D/840Di"



Компонент BRCSelWin ActiveX

Авторы: Попов А. Ю.
Гусев А. А.
Опубликовано: 10.07.2003
Версия текста: 1.0

Скачать компонент BRCSelWin  размер файла: 33 Kб
Скачать тестовое приложение  размер файла: 55 Kб


BRCSelWinCtrl - это ActiveX компонент предоставляющий панель кнопок управления.

Количество кнопок на панели, иконки для них и их названия можно менять с помощью конфигурационных файлов. Компонент имеет 3 режима работы:

  • Набор кнопок без фиксации;
  • Набор кнопок с одной зафиксированной позицией (Radio Buttons);
  • Набор кнопок с независимой фиксацией (Check Buttons).

Пример использования ActiveX компонента BRCSelWinCtrl на базе диалогового приложения

В первую очередь необходимо зарегистрировать в системе BRCSelWinCtrl ActiveX (например, из командной строки: "regsvr32 BRCSelWin.ocx").

Затем добавим поддержку BRCSelWinCtrl в диалоговом приложении. Для этого необходимо:

  1. Добавить элемент BRCSelWin Control в проект, для чего в меню Project выбрать пункт Add to Project и команду Components and Controls, далее в появившемся диалоговом окне выбрать папку Registered ActiveX Controls и найти в ней элемент BRCSelWin Control.
  2. Найти на панели Controls объект BRCSelWin Control и перетащить его в необходимое место вашего диалогового окна.
  3. Добавить переменную, которая отвечает за элемент управления, для чего в меню View вызвать команду Class Wizard, перейти на вкладку Member Variables и нажать кнопку Add Variable, убедившись, что в поле Class Name выбран класс CApplicationDlg. В новом диалоговом окне в поле Member Variable Name указать имя новой переменной.
  4. Далее необходимо загрузить файл конфигурации для панели, представляющей собой наш элемент управления. В нашем тестовом приложении для этого используется кнопка "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-файл, синтаксис которого представлен ниже:

<?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); 
// где 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() 
{
  // NORMAL
  m_SelWin.SetBarType(0);
}

void CSelWinTestDlg::OnRadioType2() 
{
  // RADIO
  m_SelWin.SetBarType(1);
}

void CSelWinTestDlg::OnRadioType3() 
{
  // CHECKABLE
  m_SelWin.SetBarType(2);
}
  • В случае если Вы хотите задать активную по умолчанию кнопку, или изменить активную кнопку в процессе работы приложения, то используйте метод:
void SetRadioCheck(long nIndex);

где nIndex задает активную на панели кнопку.

  • Если Вы хотите очистить панель, то используйте метод:
void Clear();

  • Для добавления кнопок к загруженной панели, или для создания новой панели необходимо использовать метод AddButton:
long AddButton(LPCTSTR strCaption, LPCTSTR strBitmap);
	// где strCaption - задает имя кнопки,
	//     strBitmap - путь к файлу, задающему иконку.

В нашем тестовом приложении для добавления кнопок в панель существует поле для задания названия кнопки и выпадающий список для задания пути к иконке, а так же кнопка, обрабатывающая эти два параметра и добавляющая новую кнопку в панель:

void CSelWinTestDlg::OnCmdAddButton() 
{
  CString strPath, strTemp, strCaption;



// найти выбранный элемент в 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);
}


Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав.