您现在的位置: 中国IT实验室 >> 移动设备开发 >> WINCE >> 文章正文
为Pocket PC上的IE创建ActiveX控件

ChinaITLab 收集整理  2005-3-7  保存本文  推荐给好友  QQ上看本站  收藏本站



  简介
  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值。
  
  如果控




 相关文章  热门文章
如何利用XP Embedded 的双启动提示
 Windows CE .NET中的文件系统体系结构
小议Windows CE 的下浏览器配置
WindowsCE.Net下CAN卡的驱动程序设计  
进行Windows CE开发的初步基本知识
WinCE定制的大内存支持与永久保存注册表 
WinCE中OEM适配层编程点滴之创建OAL 
Windows CE中实现蓝牙串口驱动程序 
基于微软VC6.0的WinCE软件开发工具包
WIN32 编程:嵌入式软件开发程序入门

 文章评论


认证培训
热门专题       more
相关下载
论坛新帖
博 客