获取用户输入
向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中。为设备开发可重用代码组件是一个快速而强大的方法。开来出来的组件具有体积小和执行速度快的优点,并且允许开发人员按照自己的需要扩展浏览器的功能。
其他文章:
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";