现在的位置: 首页 > 综合 > 正文

为Pocket PC上的IE创建ActiveX控件

2013年09月25日 ⁄ 综合 ⁄ 共 7025字 ⁄ 字号 评论关闭
简介

  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值。

  如果控件不支持该接口,用户将得到一个提示“该页面可能包含不安全的控件。还启用该控件吗?”的对话框。

  IObjectSafety通过IObjectSafetyImpl在ATL中实现:

  IObjectSafetyImpl<CAXSampleCtl,
          INTERFACESAFE_FOR_UNTRUSTED_CALLER |
  INTERFACESAFE_FOR_UNTRUSTED_DATA>

  在本例中,我们在ActiveX控件的创建器中设置了通用的安全选项:

m_dwCurrentSafety = INTERFACESAFE_FOR_UNTRUSTED_CALLER
              | INTERFACESAFE_FOR_UNTRUSTED_DATA;

  这将使控件无需用户介入即可创建和显示。

  获取Browser Object Model的访问权

  在ActiveX控件的创建过程中,Pocket Internet Explorer通过调用控件的QueryInterface获取IObjectWithSite值。如果控件支持该接口,Pocket Internet Explorer将用指向浏览器接口的指针调用SetSite方法。在Pocket PC上,Pocket Internet Explorer支持IBrowser和IBrowser2接口及BrowserEvents显示接口。 IBrowser

IBrowser
    Navigate
    Refresh
    Stop
    Busy
    Title
    LocationURL
    IsFrame
    ScrollStyle
    MarginWidth
    MarginHeight
    FrameNavigate
    SelectedCodepage

IBrowser2
    LayoutWidth
    LayoutHeight
    LocationBaseURL
    ClearTypeEnabled
    ClearTypeEnabled
    ScriptingEnabled
    FitToWindow
    ShowImages
    PlaySounds
    ZoomLevel

_BrowserEvents
    BeforeNavigate
    CommandStateChange
    DownloadBegin
    DownloadComplete
    NavigateComplete
    NewWindow
    TitleChange
    FrameBeforeNavigate
    FrameNavigateComplete
    OnStatusBar

  分发ActiveX控件

  在建立好ActiveX控件后,它们可以在内部使用,也可以分发给第三方使用。

  要在内部使用某ActiveX控件,只需将该控件拷贝到运行位置,并调用regsvrce.exe工具在Pocket PC设备上注册ActiveX控件。

  供第三方使用的ActiveX控件需要一个安装程序。安装程序必须注册该控件。regsrvce.exe工具可以在Pocket PC设备上注册ActiveX控件,regsvr32.exe工具可以在桌面系统上注册ActiveX控件(一般而言,成品控件都可在桌面和小型设备上使用)。另一个选择就是编写安装程序直接注册该控件。

  随ActiveX提供的安装程序应该在Windows系统目录下安装该控件的.dll(动态链接库)文件和必要的可分发.dll文件。如果用户机器上已有部分DLL,安装程序将比较这些DLL的版本,只有原DLL的版本低于新DLL的版本时才覆盖它。因为ActiveX控件只可用于OLE容器应用程序中,所以无需随控件分发所有OLE动态链接库文件。

  小结

  用户可以使用Active Template Library(ATL)for Windows CE开发ActiveX控件,并将开发出来的控件用在Pocket PC的Internet Explorer中。为设备开发可重用代码组件是一个快速而强大的方法。开来出来的组件具有体积小和执行速度快的优点,并且允许开发人员按照自己的需要扩展浏览器的功能。

from  

其他文章:

Pocket PC应用程序中使用SQL Server CE

将 ActiveX 控件集成到 SWT 应用程序

软件构件技术在MIS开发中的应用

J2EE中间件集成企业应用

WINDOWS程式设计--动态链接库(2)

Hooks(钩子)监听消息的方法

都是自动更新惹得祸

抱歉!评论已关闭.