最近收到不少关于询问浏览器开发的邮件,基本上分成两类问题,要么询问蓝蜂浏览器的框构的,要么就是询问IE相关接口的。所有来信我都抽空回复了,这个周末又收到一个关于浏览器开发的邮件,我干脆就在这里分开解释一下,以求能帮助到更多的人。邮件内容以下:
我是那个********的(由于可能会猜到身份,未经发邮件者同意,帮本人先省略),想问您些问题,也不知道您有没空,大致是这样的,
1:你那个浏览器是基于什么做的?MDI还是DIALOG?每个浏览页面是一个视图还是一个动态生成的含有iwebbrowser的对话框?
2:那个控制各个浏览器页面的标签是额外做的一些窗口吗?还是怎样?
3:那个输网址的类似于combobox的地方时完全模拟写了个类的还是基于combobox继承来的?
4:能否简单的说下chtmlview和iwebbrowser的差距吗?
5:能否说下其他一些浏览器都是采用什么做的,mdi还是dialog?我用spy++看了半天,再结合一些功能效果,感觉至少有些浏览器是MDI做的,有些感觉起来时基于做的。。。。对话框下如果实现浏览器对于使用chtmlview是否有很大限制?
一口气问了狠多问题,很不好意思啊,实在是看了很多浏览器后越看越迷茫,对于这个浏览器的架构是晕乎晕乎的,所以硬着头皮来打扰您。
也有点原因是,我分析了GreenBrowser的源代码,他是基于MDI的,我之前关于MDI做界面很不熟悉,而我又想做的是GDI自定义的界面的,所以比较费劲。才搞的很晕,手忙搅乱的。先谢过,打扰了哈,要是忙的话就挑几个简单的说下也行,呵呵
蓝蜂浏览器不是MDI,也不是SDI,更不是使用Dialog,而是自己结合这三者的优点而“创造”出来的一种框架,主窗口是直接基于CWnd的(也可以理解成Dialog,因为行为上是一致的),每一个标签对应于一个应用(或网站),而这个应用是SDI的形式的,你从打开的页面上点击链接所弹出的新窗口与原窗口都在一个标签内,也都共享一个文档对象。但从整个系统看,又是MDI框架的,因为每一个标签是对应一个文档对象,而文档的类型也有可能不同。如果你在地址栏中输入一个.cpp文件名,你会发现变成了一个编辑器,目前已支持很多种应用,但基于某些原因,暂没有公开除了浏览器之外的功能。
你问的“那个控制各个浏览器页面的标签”,我不太清楚是指标签还是每一个标签之下的那个缩略图控制,我都把相关的内容尽可能详细描述吧。标签与标题区是额外做的一个窗口(你用Spy++就可以看到),你会发现标签是绘制出来的。每一个标签之下的那些缩略图控制是放置在一个ToolBar中,但其中的缩略图也是绘制出来的。本人使用一些商业控件库,但经过了本人的深度修改(商业控件库在控制方面没有这么灵活)。
那个输网址的类似于combobox的地方是以前是继承于CCombobox的,但也正好是这个周末,本人进行了修改,现在继承于RichEdit20W,而地址栏右边的那个小控制是自己贴的图片,鼠标的消息响应需要自己处理。在现在的版本中,地址栏移到了标题的中间,这是因为很多人反映地址栏放在左上角感觉太小太挤了,于是本人参考Pivot把地址栏移到了中间。当然对于一般的框架而言,在标题栏上创建一个Edit是比较困难的,这个以后方便的话再详细讨论了。
关于chtmlview和iwebbrowser的差距,其实你可以理解成chtmlview是iwebbrowser的一个包装,chtmlview只是为了让普通开发者更容易更方便地使用iwebbrowser,为了获得更强的灵活性,你可以直接使用iwebbrowser,但我还是建议你使用chtmlview,因为简单,而且如果你需要更强的灵活性,你也可以深度使用,这不过是一个包装而已,你完全可以更深入地使用它。
浏览器是采用什么框架,这个我还真的没有怎么研究过,不过凭使用上的感觉,正象你所说,很象是MDI的。事实上,是MDI还是SDI并不重要,这些都只是为了更方便使用而抽象出来的一种模型,说白了也只是窗口和一些数据而已,不必局限于此,具体怎么用这完全得看你自己的设计了。
不知道这样的回答是否可以让你知道你所需要知道的,如果还有问题可以继续沟通。