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


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

Данный раздел содержит дополнительные разделы, относящиеся к разработке элементов управления ActiveX.К ним относятся:

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

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

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

  • Обработка особых клавиш в элементе управления

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

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

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

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

ПримечаниеПримечание

Что касается Visual C++ .NET, то среда и мастера Visual C++ больше не поддерживают DAO (хотя классы DAO включены и вы по-прежнему можете их использовать).Майкрософт рекомендует использовать шаблоны OLE DB или ODBC и MFC для новых проектов.DAO необходимо использовать только для поддержки существующих приложений.

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

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

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

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

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

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

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

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

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

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

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

  5. в окне Имя свойства, тип Array.

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

  7. Для типа Реализация, нажмите кнопку Методы Get и Set.

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

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

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

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

2dffbw6e.collapse_all(ru-ru,VS.110).gifИзменения, внесенные с помощью мастера добавления свойства

При добавлении пользовательского свойства, мастер добавления свойства вносит изменения в заголовок класса элемента управления. 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.В большинстве случаев вы измените функцию get для возвращения значения свойства.Функция задана обычно содержит код, который должен выполняться до или после изменении свойства.

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

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

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

Чтобы показать тип ошибки, которая возникла элемент управления должен передать код ошибки ThrowError или FireError.Код ошибки ЯВЛЯЕТСЯ кодом состояния, который имеет значение 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

Неправильное номер записи

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 для обработки сообщений перед их контейнером обработке.При использовании этого метода всегда возвращайте Истина если обработать сообщение в переопределенном методе 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