如果控件中出现了错误条件,您可能需要向控件容器报告此错误。根据出错的情况,有两种报告错误的方法。如果错误发生在属性的 Get 函数或 Set 函数中,或者发生在 OLE 自动化方法的实现中,则控件应调用 COleControl::ThrowError,后者将发出信号通知控件用户已发生错误。如果错误发生在任何其他时间,则控件应调用 COleControl::FireError,后者将引发常用 Error 事件。
若要指示已发生错误的种类,控件必须将错误代码传递给 ThrowError 或 FireError。错误代码是具有 32 位值的 OLE 状态代码。如有可能,请从在 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 运行时不支持 Set 语句
CTL_E_SETNOTSUPPORTED 不支持 Set 语句(只读属性)
CTL_E_NEEDPROPERTYARRAYINDEX 需要属性数组索引
CTL_E_SETNOTPERMITTED 不允许有 Set 语句
CTL_E_GETNOTSUPPORTEDATRUNTIME 运行时不支持 Get 语句
CTL_E_GETNOTSUPPORTED 不支持 Get 语句(只写属性)
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 之间的一个整数(包括 1000 和 32767)。例如:
复制代码
#define MYCTL_E_SPECIALERROR CUSTOM_CTL_SCODE(1000)
如果正在创建 ActiveX 控件以替换现有的 VBX 控件,则用与 VBX 控件所使用的数值相同的数值来定义 ActiveX 控件错误代码,以确保错误代码是兼容的。
处理控件中的特殊键
在某些情况下,可能希望以特殊的方法处理某些按键组合;例如,在多行文本框 (TextBox) 控件中按 ENTER 键时将插入新行,或者按方向键 ID 时将在一组编辑控件 (Edit Control) 之间移动。
如果 ActiveX 控件的基类是 COleControl,则可以重写 CWnd::PreTranslateMessage,以在容器处理消息之前处理这些消息。使用此技术时,如果在 PreTranslateMessage 的重写中处理消息,则总是返回 TRUE。
下列代码示例说明了一种对任何与方向键相关的消息进行处理的可能方法。
复制代码
BOOL CSampleControl::PreTranslateMessage(LPMSG lpmsg)
{
BOOL bHandleNow = FALSE;
switch (lpmsg->message)
{
case WM_KEYDOWN:
switch (lpmsg->wParam)
{
case VK_UP:
case VK_DOWN:
case VK_LEFT:
case VK_RIGHT:
bHandleNow = TRUE;
break;
}
if (bHandleNow)
OnKeyDown(lpmsg->wParam, LOWORD(lpmsg
->lParam), HIWORD(lpmsg->lParam));
break;
}
return bHandleNow;
}
有关为 ActiveX 控件处理键盘接口的更多信息,请参见 ActiveX SDK 文档。