|
简介 ActiveX控件是使用COM(组件对象模型)技术创建的一个用户界面组件。ActiveX控件具有体积小、速度快和功能强大的特点,并且可以简化集成和重用软件组件的工作。本文讨论了如何为Pocket PC上的Pocket Internet Explorer创建ActiveX控件,同时还描述了如何在基于Pocket Internet Explorer的应用程序中使用ActiveX控件。 在由Windows驱动的设备上开发和使用ActiveX控件时需要以下软件: 1. Microsoft eMbedded Visual C++ 3.0 2. Microsoft Windows CE Platform Software Development Kit(SDK)for Pocket PC 3. Microsoft Windows CE Services 2.2或更高的版本 Visual C++开发系统提供了三种为基于Windows CE设备建立ActiveX控件的方法: 自动化程度最低的方法就是不使用编程框架编写控件,而使用标准Windows CE OLE应用编程接口(API)。 用Active Template Library(ATL)for Windows CE,我们强烈建立这一方法,因为它可以得到体积更小、速度更快的控件。 使用Microsoft Foundation Classes(MFC)for Windows CE也是可行的,但不在本文的讨论范围之内。 在本文中,我们将重点讨论如何使用ATL for Windows CE为Pocket Internet Explorer开发小型、轻量的控件。 利用ATL实现ActiveX控件 使用eMbedded Visual C++创建基于ATL的ActiveX控件非常简单。只需运行eMbedded Visual C++,并使用ATL COM AppWizard创建一个新工程。ATL COM AppWizard将为您的ActiveX控件创建一个好的起点。 然后,您需要向该工程内添加COM对象。只需从菜单中选择Insert/New ATL Object(插入/新建ATL对象),然后选择Simple Object(简单对象),最后为您的ActiveX对象命名。 这就行了!您刚刚已经创建了一个Pocket Internet Explorer ActiveX控件!尽管它并不执行任何操作,但这一控件的确可以在Pocket Internet Explorer上加载。 让我们研究一下如何向该ActiveX控件添加一些功能。 添加用户界面 使用ATL向这一ActiveX控件“骨架”添加UI非常简单,只需添加两个已由ATL定义的实现方式,然后绘出您的对象即可。 向ActiveX对象添加以下实现方式将把ActiveX对象定义为控件,同时定义了一个界面,该界面允许对象直接显示自身,而无需向调用程序(IViewObject)传输数据对象。此外,IViewObject接口可以创建和管理与通知接受器的连接,让调用程序获取控件改变的通知。 CComControl<CAXSampleCtl> IViewObjectExImpl<CAXSampleCtl> 在向ActiveX控件添加了这两个实现方式后,您可以覆盖该对象刚刚继承的CComControl实现的OnDraw()方法。 在本例中,ActiveX控件将在分配给该控件的客户窗口区中绘制4个圆(稍后我们将看到如何创建指定宽度和高度的控件)。 HRESULT CAXSampleCtl::OnDraw HRESULT CAXSampleCtl::OnDraw ( ATL_DRAWINFO & di ) { RECT rc = *((RECT*)di.prcBounds); HDC hdc = di.hdcDraw; Ellipse(hdc, 0, 0, (rc.right / 2), (rc.bottom / 2)); Ellipse(hdc, (rc.right / 2), 0, rc.right, (rc.bottom / 2)); Ellipse(hdc, 0, (rc.bottom / 2), (rc.right / 2), rc.bottom); Ellipse(hdc, (rc.right / 2), (rc.bottom / 2), rc.right, rc.bottom); return S_OK; } OnDraw()函数负责为控件创建UI(用户界面)。 获取用户输入 向ActiveX对象添加的以下实现方式实现了控件与Pocket Internet Explorer间的通讯,让Pocket Internet Explorer能处理控件内的窗口消息和用户交互。 IOleControlImpl<CAXSampleCtl> IOleObjectImpl<CAXSampleCtl> IOleInPlaceActiveObjectImpl<CAXSampleCtl> IOleInPlaceObjectWindowlessImpl<CAXSampleCtl> 通过这些实现方式和消息映射,您可以处理分配给该ActiveX控件的普通窗口消息。在本例中,我们将用一个函数来指示用户点击该控件时间。首先,我们将为WM_LBUTTONDOWN定义一个消息映射,然后创建一个OnLButtonDown函数,它将在用户点击ActiveX控件时调用。 BEGIN_MSG_MAP(CAXSampleCtl) MESSAGE_HANDLER(WM_LBUTTONDOWN, OnLButtonDown) CHAIN_MSG_MAP(CComControl<CAXSampleCtl>) END_MSG_MAP() LRESULT OnLButtonDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL & bHandled); 通过该消息映射,控件将在用户点击该控件时得到通知。在本例中,我们将在用户点击控件时改变圆圈的色彩。例如,圆圈将由黑色(全 0)改变为白色(全1)。 LRESULT CAXSampleCtl::OnLButtonDown LRESULT CAXSampleCtl::OnLButtonDown ( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL & bHandled ) { POINT pt = { LOWORD(lParam), HIWORD(lParam) }; RECT rcClient; GetClientRect(&rcClient); if (PtInCircle(pt, 0, 0, (rcClient.right / 2), (rcClient.bottom / 2))) put_FillColor(~m_crFillColor); else MessageBeep(0); bHandled = TRUE; return 0; } 在put_FillColor()方法中,我们向容器(Pocket Internet Explorer)发出视图已改变的通知。该通知将让Pocket Internet Explorer更新控件的显示(也就是重绘ActiveX控件)。 STDMETHODIMP CAXSampleCtl::put_FillColor ( COLORREF crFillColor ) { if (FireOnRequestEdit(DISPID_FILLCOLOR) == S_FALSE) return S_FALSE; m_crFillColor = crFillColor; m_bRequiresSave = TRUE; FireOnChanged(DISPID_FILLCOLOR); FireViewChange(); SendOnDataChange(NULL); return S_OK; } 在Pocket Internet Explorer中访问ActiveX控件 下面,我们将添加在脚本中访问ActiveX控件属性和方法的支持。此时需要添加以下ATL实现方式: IDispatchImpl<IAXSampleCtl, &IID_IAXSampleCtl, &LIBID_AXSAMPLELib> IProvideClassInfoImpl<&CLSID_AXSampleCtl, &IID_IAXSampleCtl> 通过这些实现方式,我们就可以在Pocket Internet Explorer脚本中访问ActiveX控件的属性和方法。但首先我们还需在HTML中创建一个ActiveX对象。 HTML提供了标签,使用它即可在Pocket Internet Explorer内创建ActiveX控件。 <OBJECT ID="AXSample" CLASSID="clsid:546E636A-DD23-4E22-A6F7-07AD4CB96642" WIDTH=100 HEIGHT=100 > </OBJECT> 以上的标签及其属性创建了该控件,该控件由CLASSID标示,大小为100 x 100像素。 如果ActiveX控件没有UI,您还可以创建一个实例,并使用ActiveXObject方法经由Jscript访问该ActiveX控件。 <SCRIPT LANGUAGE=擩Script? var AX = new ActiveXObject("AXSample.AXSampleCtl"); ? </SCRIPT> ActiveXObject动态控件创建将实现脚本代码和ActiveX控件间的一些特有交互方式。 以下是一个HTML代码片段,它在用户点击名为“Change Fill Color”的HTML FORM按钮时改变AXSAMPLE ActiveX控件的FillColor(填充色)。 <SCRIPT LANGUAGE="JScript"> function fillColorChange() { AXSample.FillColor = 32000; } </SCRIPT> <FORM> <INPUT TYPE="BUTTON" VALUE="Change Fill Color" ONCLICK="fillColorChange()"> <BR> </FORM> 处理对象的标签 标签还提供了一个附加特性,可以在创建控件时设置控件的默认属性值。因此您无需创建脚本代码即可预置属性(如例子中的FillColor属性)。 该特性只可通过以下ATL实现方式获得: IPersistPropertyBagImpl<CAXSampleCtl> and property map information BEGIN_PROP_MAP(CAXSampleCtl) PROP_ENTRY("FillColor", DISPID_FILLCOLOR, CLSID_NULL) END_PROP_MAP() 向ActiveX控件添加该信息可以让您在标签内制定信息,以在创建控件时覆盖这些默认属性值。 例如,下面的代码将AXSAMPLE控件中圆圈的FillColor属性设置为黑色。 <OBJECT ID="AXSample" CLASSID="clsid:546E636A-DD23-4E22-A6F7-07AD4CB96642" WIDTH=100 HEIGHT=100 > </OBJECT> 将控件声明为“Safe for Scripting” Pocket PC是在Pocket Internet Explorer中实现ActiveX控件的第一个Windows设备。因此,浏览器将验证该控件对脚本是否安全。验证通过IObjectSafety接口实现。在创建控件时,Pocket Internet Explorer for Pocket PC调用控件上的QueryInterface获取IObjectSafety值。 如果控 | |
| 文章评论 | |||