用VC6实现IE工具栏
2009-02-21 20:00:07 来源:WEB开发网本文示例源代码或素材下载
平时一直喜欢用google在IE上的工具栏,于是也琢磨着写一个。国内介绍这个的文章太少,走了不少弯路,于是把自己的一些经验总结一下,希望对后来人有帮助。
首先,IE工具栏是一个进程内组件,被动的由IE调用。这样就要先实现一个简单的ATL工程,这个就不用介绍了吧。如果这个都不知道的话,建议还是不要再看下去了。
然后,在你的这个ATL类,需要实现三个接口:IObjectWithSite 、IDeskBand和IInputObject。
IObjectWithSite 是 IE 用来对工具栏进行管理和通讯用的一个接口。这个接口有两个函数:SetSite() 和 GetSite()。当 IE 加载你的工具栏的时候,会调用 SetSite()函数。
- IDeskBand 是IE用来确定工具栏属性的接口,有一个方法函数:GetBarInfo(),这个还属主要用来确定工具栏的一些属性,比如宽度,高度等等。
IDockingWindow 是 IDeskBank 的基,IOleWindow 又是 IDockingWindow 的基类,所以这两个基类的接口也必须实现。
IInputObject 接口是用来管理用户的输入的接口,有3个函数:UIActivateIO()、HasFocusIO()、TranslateAcceleratorIO()。当浏览器栏激活或失去活性的时候,IE 调用 UIActivateIO 函数,当 IE 需要判断哪个窗口有焦点的时候,它调用 HasFocusIO 。TranslateAcceleratorIO 用来处理加速键。
下图就是实现的一个简单示例。
从上面的接口情况,我们应该很清楚应该怎么做了:
- 在IObjectWithSite接口的SetSite方法中创建你的工具栏窗口,至于样式什么的,你可以随意发挥。值得注意的是,最好先创建一个子窗口,然后以这个子窗口作为你的工具栏的父窗口。
在IDeskBand的GetBarInfo方法中,确定你的工具栏的属性。比如说,高度、宽度、标题等等。
具体实现请参考示例程序代码,限于篇幅原因,没有把如何创建输入控件,比如说,编辑框、下拉框等等的实现。有兴趣的同志可以关注我的下一篇文章。
最后还要向IE注册我们的工具栏,以下是一个简单示例。
到此为止,IE工具栏基本完成,编译完以后,你可以打开IE,看到自己的工具栏。也有可能第一次看不到,这个时候你可以选择IE上的“视图”菜单中的“工具栏”子菜单,然后选择你的工具栏,这样你就可以看到你的工具栏出来啦!
遗留的一些问题:
XP风格的工具栏做不出来,有知道的朋友可以告诉我一声。
工具栏上的按钮不能实现任意图片、任意尺寸大小。
推荐阅读:
ATL 实现定制的 IE 浏览器栏、工具栏和桌面工具栏
赞助商链接