在Internet上 ActiveX 控件
Activex 控件是 OLE 控件规范的更新版本。 控件是开发的可用于各种不同的容器的可编程软件组件一主要体系结构,包括在 Internet 上 COM 识别 Web 浏览器。 所有 Activex 控件是 Internet 控件,并且可将其功能添加到活动文档或是网页的一部分。 使用脚本,网页上的控件能够彼此通信。
Activex 控件不限于 Internet。 ,只要控件支持该容器,所需的接口 Activex 控件还可用于任何容器。
Activex 控件有若干优点,包括:
少量必需的接口比前一 OLE 控件。
功能是无窗口和总是就地活动状态。
为了使 Activex 控件,控件必须:
支持 IUnknown 接口。
是 COM 对象。
导出 DLLRegisterServer 和 DLLUnRegisterServer。
支持附加接口根据需要为功能。
使您能够现有控件 Internet 友好
设计在 Internet 环境中适用的控件用于 Internet 的相对较少传输率需要注意事项。 您可以使用现有控件;但是,也应该采取使您的代码范围较小并将您的控件属性异步下载的步骤。
若要提高您的控件性能,请按照性能注意事项的这些提示:
实现该文章介绍的技术 Activex 控件:优化。
考虑控件如何实例化。
是异步的,不要使其他程序。
下载按少量数据组成的块。
在下载大流 (例如位图或视频数据,访问控制数据异步在与容器协作下时。 检索数据的增量或进度方法,以协作方式与还可以检索数据的其他控件一起使用。 代码还可以异步下载。
下载代码和属性在后台。
尽快成为用户界面活动。
考虑如何存储持久性数据,属性和大型数据 blob (如位图图像或视频数据)。
与数量的控件不可变数据,如大位图或 AVI 文件,需要对下载方法进行仔细考虑。 ,当控件检索在后台,文档中的数据或页可以尽快变为可见,并允许用户与页面交互。
保留代码大小和运行时编写高效的实例。
小的按钮和标签控件,并且仅几个字节持久性数据,适用于 Internet 环境并适用于在浏览器中。
考虑进度通信到容器。
通知容器在异步下载的进度,包括用户何时可以开始与页面交互,因此,下载何时完成。 容器可以显示进度 (例如完成百分比) 给用户。
考虑控件在客户端计算机上注册。
创建新的 Activex 控件
当创建新控件使用应用程序向导,您可以选择启用对异步标记以及其他优化支持。 若要添加支持异步下载控件属性,请执行以下步骤:
使用 MFC Activex 控件向导,创建项目
在 文件 菜单中单击 New 。
选择 MFC ActiveX Control Wizard 从 Visual C++ 项目并将您的项目。
在 控件设置 页上,选择 Loads properties asynchronously。 选择此选项设置为就绪状态属性和就绪状态更改事件您的。
也可以选择其他优化,例如 Windowless activation,在 Activex 控件:优化所述。
选择 完成 创建项目。
创建从 CDataPathProperty 派生的类
创建从 CDataPathProperty派生的类。
在包含控件的头文件的每个源文件,请在它之前添加此类的头文件。
此类中,重写 OnDataAvailable。 调用该函数时,就要显示的数据可用。 当数据可用,通过进度呈现它可以处理它所选择的任何方式,例如。
下面的代码的摘要是进度显示在编辑控件中数据的简单示例。 请注意使用标志 BSCF_FIRSTDATANOTIFICATION 清除编辑控件。
void CMyDataPathProperty::OnDataAvailable(DWORD dwSize, DWORD bscfFlag) { CListCtrl list_ctrl; CEdit* edit = list_ctrl.GetEditControl(); if ((bscfFlag & BSCF_FIRSTDATANOTIFICATION) && edit->m_hWnd) { edit->SetSel(0, -1); edit->Clear(); } if (dwSize > 0) { CString string; LPTSTR str = string.GetBuffer(dwSize); UINT nBytesRead = Read(str, dwSize); if (nBytesRead > 0) { string.ReleaseBuffer(nBytesRead); edit->SetSel(-1, -1); edit->ReplaceSel(string); } } }
请注意必须包括 AFXCMN.H 使用 CListCtrl 类。
当您的控件的总体状态转换 (例如,从 interactive 加载到初始化或的用户) 调用, COleControl::InternalSetReadyState。 如果您的控件只有一个数据访问权属性,可以将 BSCF_LASTDATANOTIFICATION 的代码通知您请完成下载的容器。 例如:
if (bscfFlag & BSCF_LASTDATANOTIFICATION) { GetControl()->InternalSetReadyState(READYSTATE_COMPLETE); }
重写 OnProgress。 在 OnProgress,通过显示的数字显示在当进度的最大大小和数字请下载为。 可以使用这些数字显示状态 (例如完整的百分对于用户。
下面的过程将属性添加到控件使用从派生的类。
添加属性
在 类视图,右击在库节点下的接口并选择 添加,然后 添加属性。 这将启动 Add Property Wizard。
在 Add Property Wizard,选择 Set/Get Methods 单选按钮,键入 属性名,例如, EditControlText,然后选择 BSTR 作为 Property type。
单击**“完成”**。
声明您的 CDataPathProperty的成员变量 - 对您的 Activex 控件类的派生类。
CMyDataPathProperty EditControlText;
执行 Get/Set 方法。 对于 获取,请返回字符串。 对于 Set,加载属性并调用 SetModifiedFlag。
BSTR CMFCActiveXControlCtrl::GetEditControlText(void) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); CString strResult; strResult = EditControlText.GetPath(); return strResult.AllocSysString(); } void CMFCActiveXControlCtrl::SetEditControlText(LPCTSTR newVal) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); Load(newVal, EditControlText); SetModifiedFlag(); }
在 DoPropExchange,添加下面的行:
PX_DataPath(pPX, _T("DataPath"), EditControlText);
重写请注意属性的 ResetData 通过将此行重置其控件:
EditControlText.ResetData();
确定是否从 CDataPathProperty 或 CCachedDataPathProperty 派生
上面描述派生的控件的属性步骤从 CDataPathProperty。 这是一个不错的选择,如果下载经常更改的实时数据,并且,对于其中不需要将所有数据,但是,仅当前值。 示例是为 stock ticker 控件。
可以从 CCachedDataPathProperty还派生。 在这种情况下,下载的数据在内存文件进行缓存。 这是一个不错的选择例如,如果需要保留所有下载的数据 ),进度呈现位图的控件。 在这种情况下,类包含您的数据的成员变量:
CMemFile m_Cache;
在您的 Activex 控件类,可以在 OnDraw 可以使用此内存映射文件显示数据。 在您的 Activex 控件 CCachedDataPathProperty派生类,请重写成员函数 OnDataAvailable 并在调用基类实现之后无效控件,。
void CMyCachedDataPathProperty::OnDataAvailable(DWORD dwSize, DWORD bscfFlag)
{
CCachedDataPathProperty::OnDataAvailable(dwSize, bscfFlag);
GetControl()->InvalidateControl();
}
异步下载数据使用 Activex 控件
应执行网络上的异步下载数据。 这样做的优点是,如果转换大量数据,或者连接速度较慢,下载位于客户端进程不会阻止其他处理。
异步标记提供一种异步下载数据在网络。 在异步标记的一个读取操作立即返回,因此,即使操作尚未完成。
例如,因此,如果只有 10 个字节可用并读取在 1K 文件异步调用,读取不阻止,,而是返回与当前可用的 10 个字节。
使用 CAsyncMonikerFile 类,则实现 异步标记 。 但是, Activex 控件可以使用 CDataPathProperty 类,从 CAsyncMonikerFile派生,帮助实现异步控件属性。
ASYNDOWN 示例演示如何为一个异步循环使用计时器读取数据。 ASYNDOWN 在知识库文章 “如何将详细介绍:AsyncDown 演示异步下载数据” (Q177244) 并能从 Microsoft 下载中心下载。 (有关从 Microsoft 下载文件的更多信息,请下载中心参见中的文章 “如何获取 Microsoft 支持从联机服务的文件” (Q119591) Microsoft 知识库。)知识库文章位于 MSDN Library CD-ROM 中或 https://support.microsoft.com/default.aspx?ln=zh-cn 上。
用于 ASYNDOWN 的基本技术是针对 CDataPathProperty::OnDataAvailable 的一个计时器指示数据时可用。 当计时器接收消息时,应用程序读取 128 字节块数据并填充编辑控件。 如果数据不可用,则计时器消息已处理时,计时器关闭。 ,如果多个数据迟到,OnDataAvailable 打开计时器。
显示网页中的控件
这是一个对象标记和特性的示例插入的控件在网页。
<OBJECT
CLASSID="clsid:FC25B780-75BE-11CF-8B01-444553540000"
CODEBASE="/ie/download/activex/iechart.ocx"
ID=chart1
WIDTH=400
HEIGHT=200
ALIGN=center
HSPACE=0
VSPACE=0
>
<PARAM NAME="BackColor" value="#ffffff">
<PARAM NAME="ForeColor" value="#0000ff">
<PARAM NAME="url" VALUE="/ie/controls/chart/mychart.txt">
</OBJECT>
更新现有 OLE 控件使用新的 Activex 控件功能
如果您的 OLE 控件使用 Visual C++ 的版本创建了 4.2 之前,可以采用改善其性能和增强其功能的步骤。 有关这些更改的详细讨论,请参见 Activex 控件:优化。
如果添加异步属性支持对现有的控件,则需要添加就绪状态属性和 ReadyStateChange 事件。 在控件的构造函数中,添加:
m_lReadyState = READYSTATE_LOADING;
将更新为就绪状态,代码通过调用 COleControl::InternalSetReadyState下载。 您可以调用 InternalSetReadyState 的一个位置是从 CDataPathPropertyOnProgress 重写派生类。
然后,请按照 创建新的 Activex 控件的步骤。