Donut,一个WTL示例 - 托管WebBrowser控件






4.73/5 (5投票s)
2000年10月15日

338338

2992
MDI 和标签式 WebBrowser
前言
欢迎来到Donut2。Donut已经发展成为一个实际的应用。在今年,我解决了许多问题,其中甚至包括CString的一个bug。WTL缺少:序列化应用程序通用设置的方法,序列化Rebar-Band状态,序列化Toolbar状态,Toolbar按钮的排序,以及加载8位位图Toolbar图像,还有可靠的CommandBar,OLE拖放,以及Update-Command-UI的实现。这些都是您应用程序的基础。所以我为它们写了很多草稿,并且已经达到了并发布了几乎很好的版本。在您发挥自己的作用之前,请检查一下这些代码。
特点
- 支持Microsoft Internet Explorer支持的大部分功能
- 控制图像下载,脚本运行等
- 通过Tab控件切换活动的MDI子窗口
- 阻止广告弹窗
- 支持收藏夹组
- Tab控件支持OLE拖放
- 支持加载收藏夹的顺序
- 您可以尝试 Mozilla控件
源代码指南
- ATL3.0不支持
put_DLControlFlags
(用于控制图像下载等),所以我对Atlhost.h做了一些修改。您不需要阅读AtlhostEx.h,AtlifaceEx.h,AtlifaceEx.idl,以及AtlifaceEx_i.c。 - 许多用户希望应用程序不使用“注册表”,所以我编写了MtlProfile.h用于“Ini文件”,其中的算法支持
ATL::CRegKey
。您还可以找到保存和加载ReBar Bands位置的函数。 - 在ExplorerMenu.h中,模拟了IE的“收藏夹菜单”,它可以动态加载您的收藏夹。
- 由于
WTL::CCommandBarCtrl
不支持MenuControl
(没有人会用命令栏出现在Rebar上的MDI应用程序),我编写了MDIMenuControl.h。 - 在MtlWeb.h或MtlMisc.h中,您可以找到一些实用函数。一些SHx API需要臭名昭著的“Active Desktop”,所以我不得不编写一些代码来替代它们。
- 如果是一个SDI应用程序,
WTL::UpdateUI
框架是不错的。但如果是一个MDI应用程序,我认为它没用。所以我从MFC的UpdateCommandUI
框架编写了CUpdateCmdUI.h。 - 如果文件名是Mtlx.h,我认为它是可重用的。如果不是,它就是一个草稿头文件。
问题
- 在切换活动的最大化MDI子窗口时,您可以查看普通大小的窗口。
- 如果您在页面加载完成之前激活了其他窗口,那么WebBrowser控件在您浏览的每个页面上都会失去焦点。
- 如果链接决定了目标框架,“窗口锁定”将不起作用。
- 由于我强制缩小了菜单栏和工具栏带中的rebar的垂直间隙,如果您更改了工具栏带的位置,工具栏压下按钮的顶部和底部可能无法正确绘制。
- 如果您的IE版本是IE4,您将无法加载Donut。您能修复吗?
SetWindowText
API有时似乎会崩溃。有人能修复它吗!
警告
- Donut需要WTL3.1和最新的SDK头文件。
- 根据WTL,Donut不使用C运行时库(CRT)。(但这取决于STL的实现。如果使用HP的STL,没问题。如果使用SGI的STL,则需要CRT)。如果您决定是否使用CRT,最好使用它!我认为在Donut中,它并不那么大,为了避免CRT而编写的代码量现在比CRT设置代码还多。
- 如果在Release模式下构建,编译器会警告异常无效,但请忽略它。
- 对话框资源的字体是“MS UI Gothic”。所以如果您没有这种字体,对话框布局可能会混乱。
- 由于我没有Microsoft Internet Explorer的英文版,所有的菜单文本都与英文版不同。
- 收藏夹组文件将在Donut.exe所在文件夹下的FavoriteGroup文件夹中搜索。请创建FavoriteGroup文件夹。
注释
- 简单的包装类,如CWindow,感觉很好。MFC试图控制窗口的生命周期,并经常制造麻烦。
- 即使您写了错误的代码,访问冲突也可能不会发生。我认为HWND比CWnd*更安全。
- WTL的消息映射非常灵活,因此在某些情况下,您可以比MFC编写代码更容易。
- CCommandBarCtrl是一个很大的类,但我认为显示图标的功能应该从命令栏中分离出来,以减小代码大小,因为我认为许多开发人员只需要命令栏。
- 关于WTL的rebar框架,我有一些抱怨。
- 在开发它的过程中,我发现了一些bug,您可以在这里查看,那里可能仍然有bug。
WTL还是MFC
Donut现在意味着“为什么不用WTL?”。即使您用WTL完成工作,当您共享Donut的源代码时,也不会觉得它没有用。WTL利用了Windows API的原始功能,这是完全面向对象的(您相信吗?)。这就是为什么WTL具有关键优势——最小、最快的代码,我认为这是您选择C++的原因。现在随着新的编程范式的到来,您正试图以通用的方式编写代码:基于概念、基于策略的编程,即模板魔法,VC6几乎无法处理。我相信WTL将非常适合它。