Поделиться через


Элементы управления ActiveX в MFC. Дополнительные разделы

В этой статье рассматриваются дополнительные разделы, связанные с разработкой элементов activeX. Например:

Важно!

ActiveX — это устаревшая технология, которую не следует использовать для новых разработок. Дополнительные сведения о современных технологиях, которые заменяют ActiveX, см. в разделе Элементы ActiveX.

Использование классов баз данных в элементах ActiveX

Так как классы элементов управления ActiveX являются частью библиотеки классов, вы можете применять те же процедуры и правила для использования классов баз данных в стандартном приложении MFC для разработки элементов ActiveX, использующих классы базы данных MFC.

Общие сведения о классах баз данных MFC см. в разделе "Классы баз данных MFC" (DAO и ODBC). В статье представлены как классы ODBC MFC, так и классы DAO MFC, а также дополнительные сведения об этом.

Примечание.

DAO поддерживается через Office 2013. Версия DAO 3.6 является окончательной и считается устаревшей. Среда и мастеры Visual C++ не поддерживают DAO (хотя классы DAO включены и их можно использовать). Корпорация Майкрософт рекомендует использовать шаблоны OLE DB или ODBC и MFC для новых проектов. Для обслуживания существующих приложений следует использовать только DAO.

Реализация параметризованного свойства

Параметризованное свойство (иногда называемое массивом свойств) — это метод для предоставления однородной коллекции значений в виде одного свойства элемента управления. Например, можно использовать параметризованное свойство для предоставления массива или словаря в качестве свойства. В Visual Basic доступ к такому свойству осуществляется с помощью нотации массива:

x = o.Array(2, 3) ' gets element of 2D array
o.Array(2, 3) = 7 ' sets element of 2D array

Используйте мастер добавления свойств для реализации параметризованного свойства. Мастер добавления свойств реализует свойство, добавив пару функций Get/Set, которые позволяют пользователю управления получить доступ к свойству с помощью приведенной выше нотации или стандартного способа.

Как и методы и свойства, параметризованные свойства также имеют ограничение на количество разрешенных параметров. В случае параметризованных свойств ограничение составляет 15 параметров (с одним параметром, зарезервированным для хранения значения свойства).

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

Добавление параметризованного свойства с помощью мастера добавления свойств

  1. Загрузите проект элемента управления.

  2. В представлении класса разверните узел библиотеки элемента управления.

  3. Щелкните правой кнопкой мыши узел интерфейса для элемента управления (второй узел узла библиотеки), чтобы открыть контекстное меню.

  4. В контекстном меню выберите команду Добавить, а затем — Добавить свойство.

  5. В поле "Имя свойства" введите Array.

  6. В поле "Тип свойства" выберите short.

  7. В поле Тип реализациивыберите Методы Get/Set.

  8. В полях "Получить функцию" и "Задать функции" введите уникальные имена для функций Get и Set или примите имена по умолчанию.

  9. Добавьте параметр, называемый строкой (тип short), с помощью элементов управления "Имя параметра" и "Тип параметра".

  10. Добавьте второй параметр с именем column (type short).

  11. Нажмите кнопку Готово.

Изменения, внесенные мастером добавления свойств

При добавлении настраиваемого свойства мастер добавления свойств вносит изменения в заголовок класса элемента управления (). H) и реализация (. Файлы CPP.

Следующие строки добавляются в класс элемента управления. H-файл:

SHORT GetArray(SHORT row, SHORT column);
void SetArray(SHORT row, SHORT column, SHORT newVal);

Этот код объявляет две функции, SetArray которые GetArray позволяют пользователю запрашивать определенную строку и столбец при доступе к свойству.

Кроме того, мастер добавления свойств добавляет следующие строки в карту диспетчера управления, расположенную в реализации класса элемента управления (). Файл CPP:

DISP_PROPERTY_PARAM_ID(CMyAxUICtrl, "Array", dispidArray, GetArray, SetArray, VT_I2, VTS_I2 VTS_I2)

Наконец, реализации GetArray функций SetArray добавляются в конец. CPP-файл. В большинстве случаев вы измените функцию Get, чтобы вернуть значение свойства. Функция Set обычно содержит код, который должен выполняться либо до, либо после изменения свойства.

Чтобы это свойство было полезным, можно объявить двухмерную переменную члена массива shortв классе элемента управления типа, чтобы сохранить значения для параметризованного свойства. Затем можно изменить функцию Get, чтобы вернуть значение, хранящееся в правильной строке и столбце, как указано в параметрах, и изменить функцию Set, чтобы обновить значение, на которое ссылается параметры строки и столбца.

Обработка ошибок в элементе ActiveX

Если в элементе управления возникают ошибки, может потребоваться сообщить об ошибке контейнеру элементов управления. Существует два метода создания отчетов об ошибках в зависимости от ситуации, в которой возникает ошибка. Если ошибка возникает в функции Get или Set свойства или в рамках реализации метода OLE Automation, элемент управления должен вызвать COleControl::ThrowError, который сигнализирует пользователю элемента управления об ошибке. Если ошибка возникает в любое время, элемент управления должен вызвать COleControl::FireError, что вызывает событие ошибки акции.

Чтобы указать тип ошибки, в который произошла ошибка, элемент управления должен передать код ThrowError ошибки или FireError. Код ошибки — это код состояния OLE, имеющий 32-разрядное значение. По возможности выберите код ошибки из стандартного набора кодов, определенных в OLECTL. Файл заголовка H. В следующей таблице приведены эти коды.

Коды ошибок элемента управления ActiveX

Ошибка Описание
CTL_E_ILLEGALFUNCTIONCALL Недопустимый вызов функции
CTL_E_OVERFLOW Overflow
CTL_E_OUTOFMEMORY Недостаточно памяти
CTL_E_DIVISIONBYZERO Деление по нулю
CTL_E_OUTOFSTRINGSPACE Недостаточно места для строки
CTL_E_OUTOFSTACKSPACE Недостаточно места для стека
CTL_E_BADFILENAMEORNUМБ ER Недопустимое имя файла или номер
CTL_E_FILENOTFOUND Файл не найден
CTL_E_BADFILEMODE Недопустимый режим файла
CTL_E_FILEALREADYOPEN Файл уже открыт
CTL_E_DEVICEIOERROR Ошибка ввода-вывода устройства
CTL_E_FILEALREADYEXISTS Файл уже существует
CTL_E_BADRECORDLENGTH Недопустимая длина записи
CTL_E_DISKFULL Нет места на диске
CTL_E_BADRECORDNUМБ ER Неверный номер записи
CTL_E_BADFILENAME Недопустимое имя файла
CTL_E_TOOMANYFILES Слишком много файлов
CTL_E_DEVICEUNAVAILABLE Устройство недоступно
CTL_E_PERMISSIONDENIED Отказ в разрешении
CTL_E_DISKNOTREADY Диск не готов
CTL_E_PATHFILEACCESSERROR Ошибка доступа к пути или файлу
CTL_E_PATHNOTFOUND Путь не найден
CTL_E_INVALIDPATTERNSTRING Недопустимая строка шаблона
CTL_E_INVALIDUSEOFNULL Недопустимое использование NULL
CTL_E_INVALIDFILEFORMAT Недопустимый формат файла
CTL_E_INVALIDPROPERTYVALUE Недопустимое значение свойства
CTL_E_INVALIDPROPERTYARRAYINDEX Недопустимый индекс массива свойств
CTL_E_SETNOTSUPPORTEDATRUNTIME Установка не поддерживается во время выполнения
CTL_E_SETNOTSUPPORTED Set не поддерживается (свойство доступно только для чтения)
CTL_E_NEEDPROPERTYARRAYINDEX Требуется индекс массива свойства
CTL_E_SETNOTPERMITTED Функция set запрещена
CTL_E_GETNOTSUPPORTEDATRUNTIME Get не поддерживается во время выполнения
CTL_E_GETNOTSUPPORTED Get не поддерживается (свойство доступно только для записи).
CTL_E_PROPERTYNOTFOUND Свойство не найдено
CTL_E_INVALIDCпакет интерфейса пользователя BOARDFORMAT Недопустимый формат буфера обмена
CTL_E_INVALIDPICTURE Недопустимое изображение
CTL_E_PRINTERERROR Ошибка принтера
CTL_E_CANTSAVEFILETOTEMP Не удается сохранить файл в TEMP
CTL_E_SEARCHTEXTNOTFOUND Искомый текст не найден
CTL_E_REPLACEMENTSTOOLONG Недопустимая длина замены

При необходимости используйте макрос CUSTOM_CTL_SCODE для определения пользовательского кода ошибки для условия, не охватываемого одним из стандартных кодов. Параметр для этого макроса должен быть целым числом от 1000 до 32767 включительно. Например:

#define MYCTL_E_SPECIALERROR CUSTOM_CTL_SCODE(1000)

Если вы создаете элемент ActiveX для замены существующего элемента управления VBX, определите коды ошибок элемента управления ActiveX с теми же числовыми значениями, что и элемент управления VBX, который использует для обеспечения совместимости кодов ошибок.

Обработка специальных ключей в элементе управления

В некоторых случаях может потребоваться обрабатывать определенные сочетания нажатия клавиш особым образом; Например, вставьте новую строку при нажатии клавиши ВВОД в элементе управления многострочного текстового поля или перемещении между группой элементов управления редактированием при нажатии идентификатора клавиши направления.

Если базовый класс элемента управления ActiveX имеет значение COleControl, можно переопределить CWnd::P reTranslateMessage для обработки сообщений перед их обработкой контейнера. При использовании этого метода всегда возвращайте значение TRUE , если вы обрабатываете сообщение в переопределении PreTranslateMessage.

В следующем примере кода демонстрируется возможный способ обработки любых сообщений, связанных с направленными ключами.

BOOL CMyAxUICtrl::PreTranslateMessage(MSG* pMsg)
{
   BOOL bHandleNow = FALSE;

   switch (pMsg->message)
   {
   case WM_KEYDOWN:
      switch (pMsg->wParam)
      {
      case VK_UP:
      case VK_DOWN:
      case VK_LEFT:
      case VK_RIGHT:
         bHandleNow = TRUE;
         break;
      }
      if (bHandleNow)
      {
         OnKeyDown((UINT)pMsg->wParam, LOWORD(pMsg->lParam), HIWORD(pMsg->lParam));
      }
      break;
   }
   return bHandleNow;
}

Дополнительные сведения об обработке интерфейсов клавиатуры для элемента управления ActiveX см. в документации по пакету SDK ActiveX.

Доступ к элементам управления диалогового окна, которые невидимы во время выполнения

Вы можете создавать элементы управления диалоговым окном, которые не имеют пользовательского интерфейса и невидимы во время выполнения. Если добавить невидимый элемент activeX во время выполнения в диалоговое окно и использовать CWnd::GetDlgItem для доступа к элементу управления, элемент управления не будет работать правильно. Вместо этого следует использовать один из следующих методов для получения объекта, представляющего элемент управления:

  • С помощью мастера добавления переменной-члена выберите элемент управления "Переменная ", а затем выберите идентификатор элемента управления. Введите имя переменной члена и выберите класс оболочки элемента управления в качестве типа элемента управления.

    или

  • Объявите локальную переменную и подкласс в качестве элемента диалогового окна. Вставьте код, похожий на следующий (CMyCtrl является классом оболочки, IDC_MYCTRL1 является идентификатором элемента управления):

    CCirc myCirc;
    myCirc.SubclassDlgItem(IDC_CIRCCTRL2, this);
    // ... use myCirc ...
    myCirc.UnsubclassWindow();
    

См. также

Элементы ActiveX библиотеки MFC