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


Элементы управления 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 (с одним параметром зарезервировано для хранения значения свойства).

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

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

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

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

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

  4. В контекстном меню щелкните Добавить, а затем щелкните Добавить свойство.

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

  6. В поле свойство Type, выберите short.

  7. Для типа Реализация, щелкните Get/set методы.

  8. В полях Функция Get и Функция Set, уникальные имена типа для получения и установки или функции принимают имена по умолчанию.

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

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

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

Изменения, выполненные с помощью мастера добавления свойства.

При добавлении пользовательского свойства, мастера добавления свойства вносит изменения в качестве заголовка класса элемента управления (. 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();
    

См. также

Основные понятия

Элементы управления ActiveX MFC