2501,wtl显示html

原文

在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.

相关推荐
IMPYLH12 小时前
HTML 的 <wbr> 元素
前端·html
zhaiyy18 小时前
HTML Popover API 实践
前端·javascript·html
JingliAlex18 小时前
企业微信自动回复的话术怎么过审?三级审核流程的搭法
大数据·html·企业微信
ShineWinsu21 小时前
对于HTML:HTML常见标签的解析—上
前端·面试·html·浏览器·标签·图片·超链接
百度一下吧1 天前
HTML5 新增标签与 Web Components 使用指南
前端·html·html5
tryCbest1 天前
第一篇:HTML5 核心知识全解 + 项目起步
前端·html·html5
衡石科技1 天前
一个门户只保留一个智能助理:衡石嵌入式 Data Agent 的运行与渲染边界
前端·javascript·html·data agent
言乐61 天前
HTML实现Word、Excel、PPT三种可切换背景,可键盘打字、和像素小人交互
html·word·powerpoint·excel·交互
西瓜很甜哟1 天前
golang实现大文件分片上传
后端·golang·html
闭包不眠1 天前
Word转HTML后体积不对,裁掉的截图原图还在
前端·图像处理·人工智能·计算机视觉·html·word