Элементы управления ActiveX в MFC. Дополнительные разделы
В этой статье рассматриваются дополнительные разделы, относящиеся к разработке элементов управления ActiveX. К ним относятся:
Использование классов базы данных в элементах управления ActiveX
Реализация параметризованное свойство
Обработка ошибок в коде элемента управления ActiveX
Обработка специальные ключи в элементе управления
Доступ к элементам управления диалогового окна, невидимы во время выполнения
Использование классов базы данных в элементах управления ActiveX
Так как классы элементов управления ActiveX в библиотеку классов, можно применить те же процедуры и правила использования классов базы данных в стандартном приложении MFC в разработке элементов управления ActiveX, которые используют классы MFC базы данных.
Общие сведения о классов баз данных MFC см. в разделе Классы MFC DAO и ODBC (). Раздел содержит описание и классы MFC ODBC и MFC DAO и направляет. для получения дополнительных сведений об этом.
Примечание
Что касается Visual C++ .NET, то среда и мастера 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 и задать функций, которая позволяет пользователю элемента управления для доступа к свойству с помощью вышеуказанную нотацию или в стандартной таким.
Аналогично методам и свойствам, параметризированным свойства также может настроить ограничение на число разрешенных параметров. При использовании параметризованных свойств, ограничение параметры 15 (с одним параметром зарезервировано для хранения значения свойства).
Следующая процедура добавляет параметризованное свойство, именуемое Массив, который можно получить как двумерный массив целых чисел.
Добавление параметризованное значение свойства с помощью мастера добавления свойства.
Загрузите проект элемента управления.
В представлении классов разверните узел библиотеки элемента управления.
Щелкните правой кнопкой мыши узел интерфейса для элемента управления (второго узла узла библиотеки), чтобы открыть контекстное меню.
В контекстном меню щелкните Добавить, а затем щелкните Добавить свойство.
В поле Имя свойства введите Array.
В поле свойство Type, выберите short.
Для типа Реализация, щелкните Get/set методы.
В полях Функция Get и Функция Set, уникальные имена типа для получения и установки или функции принимают имена по умолчанию.
Добавьте параметр с именем row (тип short), с помощью элементов управления Имя параметра и Тип параметра .
Добавьте второй column с именем параметра (тип short).
Нажмите кнопку Готово.
Изменения, выполненные с помощью мастера добавления свойства.
При добавлении пользовательского свойства, мастера добавления свойства вносит изменения в качестве заголовка класса элемента управления (. H) и файлы реализации (CPP).
Следующие линии добавляются в класс элемента управления. Файл H:
SHORT GetArray(SHORT row, SHORT column);
void SetArray(SHORT row, SHORT column, SHORT newVal);
Этот код объявляет 2 вызываемой функции GetArray и SetArray, позволяющие пользователю оставлять определенные строку и столбец к свойству.
Кроме того, мастер добавления свойства добавляются следующие три линии на схеме подготовки к отправке элемента управления, находящуюся в файле реализации класса элемента управления (CPP).
DISP_PROPERTY_PARAM_ID(CMyAxUICtrl, "Array", dispidArray, GetArray, SetArray, VT_I2, VTS_I2 VTS_I2)
Наконец, реализации GetArray и функции SetArray добавляются в конец файла CPP. В большинстве случаев следует изменить функции получения для возврата значения свойства. Указывает функция обычно содержит код, который должен выполняться, до или после изменения свойств.
Для этого свойства точности, можно объявить переменной-члена двумерного массива в классе элемента управления, типа short, для хранения значения свойства с параметрами Затем можно изменить функции получения для возврата значения, хранящиеся в правильную строку и столбец, как показано параметрами и измените настройки параметров функции для обновления значения указанные параметрами строки и столбца.
Обработка ошибок в коде элемента управления ActiveX
Если условия ошибки возникают в элементе управления, можно создать отчет об ошибке на контейнер элементов управления. 2 Метода для сообщений об ошибках, в зависимости от ситуации, в которой произошла ошибка. При возникновении ошибки в свойство get или set, функции или внутри реализации метода ole-автоматизации, элемент управления должен вызвать метод COleControl::ThrowError, которое сигнализирует пользователю элемента управления, что произошла ошибка. При возникновении ошибки в любое другое время, элемент управления должен вызвать метод COleControl::FireError, который вызывает событие ошибки хранения.
Для указания типа возникшей ошибки элемент управления должен передать код ошибки в ThrowError или FireError. Код ошибки OLE код состояния, который имеет значение 32 бит. Если возможно, выберите код ошибки из стандартного набора кодов, определенных в файле заголовка OLECTL.H. В следующей таблице перечислены эти коды.
Коды ошибок элемент управления ActiveX
Ошибка |
Описание |
---|---|
CTL_E_ILLEGALFUNCTIONCALL |
Недопустимый вызов функции |
CTL_E_OVERFLOW |
Переполнение |
CTL_E_OUTOFMEMORY |
Недостаточно памяти |
CTL_E_DIVISIONBYZERO |
Деление на ноль |
CTL_E_OUTOFSTRINGSPACE |
Не хватает строки |
CTL_E_OUTOFSTACKSPACE |
Из пространство стека |
CTL_E_BADFILENAMEORNUMBER |
Имя файла или число таких |
CTL_E_FILENOTFOUND |
Файл не найден |
CTL_E_BADFILEMODE |
Недопустимый файловый режим |
CTL_E_FILEALREADYOPEN |
Файл уже открытого |
CTL_E_DEVICEIOERROR |
Ошибка ВВОДА-ВЫВОДА устройства |
CTL_E_FILEALREADYEXISTS |
Файл уже существует |
CTL_E_BADRECORDLENGTH |
Неверная рекордная длина |
CTL_E_DISKFULL |
Нет места на диске. |
CTL_E_BADRECORDNUMBER |
Неправильное количество record |
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 |
Не поддерживается набор (свойство только для чтения) |
CTL_E_NEEDPROPERTYARRAYINDEX |
Индекс массива свойства необходимости |
CTL_E_SETNOTPERMITTED |
Не разрешается набор |
CTL_E_GETNOTSUPPORTEDATRUNTIME |
Получение не поддерживаемых во время выполнения |
CTL_E_GETNOTSUPPORTED |
Получение не поддерживаемых (доступное только на запись свойство) |
CTL_E_PROPERTYNOTFOUND |
Не найдены свойство |
CTL_E_INVALIDCLIPBOARDFORMAT |
Недопустимый формат буфера обмена |
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::PreTranslateMessage для обработки сообщений перед их процессами контейнера. При использовании этого метода, всегда возвращается значение 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();