在MFC
程序中有专门封装
的CHTMLView
来显示超文本
文件,如果在对话框
中显示网页
可用CDHTMLDialog
,甚至可实现多页超文本
向导风格的对话框
,但是在WTL
中却没有单独封装超文本
的对应控件,这是因为COM
组件的使用和编写
本来就是ATL
的强项,WTL
扩展的是ATL
欠缺的桌面应用的功能部分
,所以即使不使用WTL
也可用ATL
的基本功能来显示超文本
,首先来看如何显示一个超文本
:
cpp
struct CWelcomePage : public CWindowImpl < CWelcomePage , CAxWindow >
{
DECLARE_WND_SUPERCLASS( TEXT( " WelcomePage " ) , CAxWindow::GetWndClassName( ) )
BEGIN_MSG_MAP_EX( CWelcomePage )
END_MSG_MAP( )
};
上面类声明
中,和普通的类唯一不同
的就是基类
使用了CAxWindow
而不是CWindow
.
然后创建窗口
的使用按对应的网址
指定窗口标题
就可以了,如下:
cpp
CWelComePage WelcomePage;
WelcomePage.Create( m_hWnd , rcDefault , TEXT( " http://www.microsoft.com " ), dwStyle);
首先来看下,声明了一个从CAxWindow
集成类的实例时ATL
干了什么:在CAxWindow
的构造器
中,调用了注册了两个特定的消息
来让CAxWindow
取得主机
和内部
包含的COM
控件的AtlAxWinInit
函数.
更重要
的是注册
了一个叫做ATLAXWIN_CLASS
的窗口类
,ATLAXWIN_CLASS
是一个在VS2008
附带的ATL
中按"AtlAxWin90"
定义的宏.
该窗口类
的窗口函数
不是普通的窗口
那样使用一个开始函数
,然后内部
去初化槽
,而是使用了一个全局静态函数
:AtlAxWindowProc
,看看该函数的实现.
哦,看到了在处理WM_CREATE
消息,在处理该消息
中,如果窗口标题
不是空的,则使用窗口标题
的最为首参数
调用内部直接调用
,内部
创建一个CAxHostWindow
然后调用该实例
的CreateControlLicEx
的AtlAxCreateControlLicEx
的AtlAxCreateControlLic
函数.
恩,继续
跟踪到CreateNormalizedObject
函数内部,啊哦,终于找到了,在该函数
内部根据传入的串
来决定创建什么
:如果是"MSHTML"
😦不区分大小写
)则创建HTMLDocument
对象;
否则如果发现包含":"
,则创建WebBrowser
对象;否则检查是否为类标
的串格式(即第一个符是'{'
),并,按类标
转换,如果转换成功
则使用该类标
创建对象;
恩,创建
了对象了,那何时加载并显示网页
呢?继续.
CreateNormalizedObject
函数,创建完了控件
,返回到CreateControlLicEx
,继续向下代码
实现是,如果是"MSHTML:"
,则取IPersistStreamInit
接口,调用加载
,否则试取IWebBrowser2
接口,如果包含该接口
则调用Navigate2
.