简介
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(钩子)监听消息的方法
都是自动更新惹得祸
google_ad_client = "pub-2416224910262877";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_ad_channel = "";
google_color_border = "E1771E";
google_color_bg = "FFFFFF";
google_color_link = "0000FF";
google_color_text = "000000";
google_color_url = "008000";
分享到:
相关推荐
Often Pocket PC programs need a background process and most of existing Pocket PC programs implement it by creating an executable file which is started during system start-up. But Pocket PC has 32 ...
文档明确描述如何使用非 Microsoft 基础类 MFC Win 32 应用程序中 SHFullScreen API 来创建 PocketPC 上全屏窗口。 但是, 文档未介绍相同过程基于 MFC 的应用程序。 本文介绍如何通过使用 Win32API 或 MFC 进行全 ...
This book is both a tutorial and reference guide for writing network applications on Pocket PC 2002 and Pocket PC Phone Edition devices. The term network application does not limit the scope of this ...
VS2008 Pocket PC 2003 SE仿真程序上网设置
被文档介绍了在VS2005+ActiveSync+PPC环境下如何正确配置使模拟器Pocket PC上网的说明。
本软件是基于Pocket PC、手持设备和手机上的掌上水准测量程序,解决外业水准测量的记录问题,程序能根据观测等级、仪器类型按规范要求的观测顺序自动移动光标位置,自动完成计算并根据各限差要求对超限数据提醒;...
这是一个基于WinCE Pocket PC,用C#开发出来的手机小游戏,占用空间下,可供休闲娱乐
Google Map for Pocket PC,本文件为CAB安装包,直接拷贝到Pocket PC上然后运行就可以了。
实战Pocket PC程序设计 详解介绍了 Pocket PC程序设计的主要方面,适合熟悉桌面开发,想进行 Pocket PC手机程序设计的入门者了解PocketPC 开发与桌面的主要不同,这个是中文版
简单易懂轻松用c#语言中实现 pad 或pocket pc 的键盘的隐藏和显示
Pocket PC 2003 PDA简易通讯录用VS2008 c#语言做 符合团队开发标准
.Net在PocketPC上的数据库开发
安裝方法: 1. 安裝evb runtime ... 把下載的文件Copy 入Pocket pc 內執行 2. 解壓estock.zip ...首先把Pocket pc 連接PC , 並且可以上Internet 使用 資料下載 其後 可以使用 圖表 及 分析.
基于PocketPC的汉字输入系统的设计与实现 对设计输入法有一定的理论指导作用。
用C#在Pocket PC上播放.wav声音文件
PocketPC下PocketPC下的俄罗斯方块游戏的俄罗斯方块游戏PocketPC下的俄罗斯方块游戏PocketPC下的俄罗斯方块游戏PocketPC下的俄罗斯方块游戏
在pocket pc 上以位图的形式保存个人签名
本文介绍配置Pocket PC 2003 SE设备仿真器网络设置的方法共有六个步骤,通过配置可以实现PDA上网。
Pocket PC 屏幕旋转 应用程序,兼容所有Pocket PC所有版本。