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

使用添加属性向导实现参数化的属性。 添加属性向导通过将对实现属性允许用户使用控件访问属性的表示法或标准方式工作的 get/set 函数。

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

下面过程添加参数化的属性,调用数组,可以访问为一个二维整数数组。

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

  1. 加载控件的项目。

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

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

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

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

  6. 属性类型 框中,选择 short

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

  8. Get Function设置函数 框中,键入一个唯一名称。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);

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

此外,添加属性向导添加下列代码行添加到控件映射计划,位于控件类实现 (.cpp) 文件:

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

最后,GetArray 的实现和 SetArray 函数被添加到 .cpp 文件的结尾。 在许多情况下,您将修改获取函数返回属性值。 集合函数通常将包含应执行的代码,或者一,在属性更改之前。

对于这是有用的属性,可以声明在控件类的二维数组成员变量,short类型,为参数化的属性存储值。 然后可以修改获取函数返回值存储在相应的行和列表示的,这由参数,然后修改集合函数更新行和列参数引用的值。

在 ActiveX 控件中的错误处理

如果错误状态控件中发生错误,则可能需要移动到控件容器报告。 具有报告错误的两种方法,根据错误的情况。 如果错误在属性的 get 或设置函数中,或放在一个 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

使用空的无效用法

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 键被按下一个多行 TextBox 控件或将在编辑一组控件之间时,一定向按 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 访问控件,控件将无法正常工作。 相反,应使用以下技术之一获取表示的控件对象:

  • 使用"添加成员变量向导 控件变量 (O),然后选择 . 控件的 ID 输入成员变量的名称并选择控件的包装类定义为 控件类型

    - 或 -

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

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

请参见

概念

MFC ActiveX 控件