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 个参数 (其中一个参数用于存储属性值保留)。
下面的过程添加参数化的属性,称为 " 数组,则可以获取作为一个二维整数数组。
使用 " 添加属性向导 ",添加一个参数化属性
加载您的控件的项目中。
在 " 类视图 " 中,展开您的控件库节点。
右击您的控件 (库节点的第二个节点接口节点) 打开快捷菜单。
从快捷菜单上,单击 添加 然后单击 添加属性。
在 属性名 框中,键入 Array。
在 属性类型 框中,选择 不足。
为 实现 类型,单击 Get/Set Methods。
在 Get Function 和 Set Function 框中,键入唯一的名称。获取和设置功能或接受默认名称。
将一个参数,调用 row (类型 short),使用 参数名称 和 Parameter Type 控件。
添加第二个参数调用的 column (类型 short)。
单击**“完成”**。
添加属性向导所做的更改
当您添加自定义属性时, " 添加属性向导对控件类头的更改 (。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,激发一个库存错误事件。
若要指示发生了错误,则控件必须通过错误代码。 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 |
设备 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();