MFC ActiveX 控件:高级主题

本文包含高级主题与开发的 Activex 控件相关。 这些元素包括:

  • 使用在 Activex 控件中数据库类

  • 实现参数化的属性

  • 进程在您的 Activex 控件的错误

  • 处理在控件的特殊键

  • 在运行时不可见的访问的对话框控件

使用在 Activex 控件中数据库类

由于 Activex 控件是类库的一部分,您可以将相同程序和规则用于数据库类标准 MFC 应用程序于使用 MFC 数据库类的开发的 Activex 控件。

有关 MFC 数据库类提供一个一般概述,请参见 MFC 数据库类 (DAO 和 ODBC)。 这篇文章介绍 MFC ODBC 类和 MFC DAO 类并处理您在其中之一的更多详细信息。

备注

从 Visual C++ .NET 起,Visual C++ 环境和向导不再支持 DAO(不过提供了 DAO 类,仍可供您使用)。Microsoft 建议对新项目使用 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

使用 " 添加属性向导实现参数化的属性。 添加属性向导将添加允许管理用户访问属性使用上面的表示法或 enter 标准方式获取/设置的函数对实现属性。

类似于方法和属性,参数化属性还有一个限制。允许参数的数目。 对于参数化属性,限制为 15 个参数 (其中一个参数用于存储属性值保留)。

下面的过程添加参数化的属性,称为 " 数组,则可以获取作为一个二维整数数组。

使用 " 添加属性向导 ",添加一个参数化属性

  1. 加载您的控件的项目中。

  2. 在 " 类视图 " 中,展开您的控件库节点。

  3. 右击您的控件 (库节点的第二个节点接口节点) 打开快捷菜单。

  4. 从快捷菜单上,单击 添加 然后单击 添加属性

  5. 属性名 框中,键入 Array。

  6. 属性类型 框中,选择 不足

  7. 实现 类型,单击 Get/Set Methods

  8. Get FunctionSet Function 框中,键入唯一的名称。获取和设置功能或接受默认名称。

  9. 将一个参数,调用 row (类型 short),使用 参数名称Parameter Type 控件。

  10. 添加第二个参数调用的 column (类型 short)。

  11. 单击**“完成”**。

2dffbw6e.collapse_all(zh-cn,VS.110).gif添加属性向导所做的更改

当您添加自定义属性时, " 添加属性向导对控件类头的更改 (。H) 和实现 (.CPP) 文件。

以下行添加到控件类。H 文件:

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

此代码声明允许用户请求特定的行和列,当访问属性时的两个函数调用 GetArray 和 SetArray 。

此外, " 添加属性向导 " 将以下行添加到控制计划映射,位于控件类实现 (.CPP) 文件:

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

最后, GetArray 的实现和 SetArray 功能添加到 .CPP 文件的结尾。 在大多数情况下,您将修改获取函数返回属性的值。 该设置的函数通常包含应执行的代码,其中之一,属性更改前后。

为使此的属性有用,可以声明在控件类的二维数组成员变量,类型 不足,为参数化属性的存储值。 然后您可以修改获取函数返回值存储在相应的行和列,这由参数,并修改该设置的函数更新行和列参数引用的值。

进程在您的 Activex 控件的错误

如果错误状态在控件时,您可能需要该错误移到控件容器报告。 具有报告错误的两个方法,具体取决于该错误的情况。 如果错误发生在属性中获取内启动或设置功能,或者在一个 OLE 自动化方法的实现中,控件应调用 COleControl::ThrowError,控制用户的信号错误。 如果错误在+其他+时候生成,控件应调用 COleControl::FireError,激发一个库存错误事件。

若要指示发生了错误,则控件必须通过错误代码。 ThrowErrorFireError。 错误代码是一个 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

设备 I/O 错误

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 控件,请定义具有 VBX 控件用于确保相同的数值的 Activex 控件错误代码错误代码是兼容的。

处理在控件的特殊键

有时可能希望处理某些按键组合以特定方式;例如,插入新行,当 enter 键为按下某个多行文本框控件或移动各个组之间编辑控件,当一方向键 ID 按的。

如果 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 控件的键盘界面的更多信息,请参见 ActiveX SDK 文档。

在运行时不可见的访问的对话框控件

可以创建没有用户界面并在运行时不可见的对话框控件。 如果添加了不在运行时 Activex 控件添加到对话框并使用 CWnd::GetDlgItem 访问控件,该控件将无法正常工作。 相反,应使用以下技术之一获取表示控件的对象:

  • 使用 " 添加成员变量向导中,选择 " Control Variable 然后选择控件的 ID. 输入成员变量名并选择一个控件的包装类作为 控件类型

    - 或 -

  • 声明局部变量和子类为 " 对话框项目。 类似于下面的代码 (CMyCtrl 是包装类, IDC_MYCTRL1 是控件的 ID):

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

请参见

概念

MFC ActiveX 控件