Элементы управления 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, к которому можно получить доступ в виде двухмерного массива целых чисел.
Добавление параметризованного свойства с помощью мастера добавления свойств
Загрузите проект элемента управления.
В представлении класса разверните узел библиотеки элемента управления.
Щелкните правой кнопкой мыши узел интерфейса для элемента управления (второй узел узла библиотеки), чтобы открыть контекстное меню.
В контекстном меню выберите команду Добавить, а затем — Добавить свойство.
В поле "Имя свойства" введите
Array
.В поле "Тип свойства" выберите
short
.В поле Тип реализациивыберите Методы Get/Set.
В полях "Получить функцию" и "Задать функции" введите уникальные имена для функций Get и Set или примите имена по умолчанию.
Добавьте параметр, называемый строкой (тип short), с помощью элементов управления "Имя параметра" и "Тип параметра".
Добавьте второй параметр с именем column (type short).
Нажмите кнопку Готово.
Изменения, внесенные мастером добавления свойств
При добавлении настраиваемого свойства мастер добавления свойств вносит изменения в заголовок класса элемента управления (). 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();