为了在对话框中加载web页面,调用CHtmlCtrl::LoadFromResource函数,它是由CHtmlView继承而来的。也可以用全路径res://ShowHtml.exe/about.htm作为参数。除此之外,还有一个问题就是:CAboutDialog对话框中\"OK\"按钮的处理,其实,它根本就不是一个按钮,而是一个在HTML文件中嵌入的图像,用JScript来控制图像被按下时和弹起时的状态。处理\"OK\"按钮的技巧主要是解决对话框与主控程序之间的通讯。利用动态HTML文档层(COM)技术可以处理用户单击图像或链接,方法是获得图像元素,然后侦听OnClick事件。但这是一种非常非常麻烦的方法。还有一种更简单的方法。假设HTML有如下的图像链接:
<A href=\"ok\"><IMG ...></A>
当用户单击它时,浏览器显示这个\"OK\"文件,但是在显示之前,控制先执行CHtmlView::OnBeforeNavigate2()函数,为此可以定义CHtmlCtrl类的子类CMyHtmlCtrl,重载这个函数,在这里面实现想做的任何事情。下面的代码实现了当用户点击HTML文件上的\"OK\"图片时,关闭对话框。
void CHtmlCtrl::OnBeforeNavigate2(
LPCTSTR lpszURL,
...,
BOOL* pbCancel)
{
if (_tcscmp(lpszURL,_T(\"ok\"))==0)
{
// \"ok\" clicked:
*pbCancel=TRUE; // abort
GetParent()->SendMessage(WM_COMMAND,IDOK); // will close dialog
}
}
其实\"OK\"并不是什么文件;它只是一个很特殊的名字,可以定义一个CHtmlCtrl类的子类CMyHtmlCtrl,该类将\"OK\"图片看作是\"OK\"按钮。为了实现这个想法,程序中创建了一个叫app:的冒充协议来代替\"OK\",在about.htm中定义实际的链接是app:ok。每当浏览器导航到app:somewhere的时候,CMyHtmlCtrl都以\"somewhere\"为参数调用一个虚函数:CMyHtmlCtrl::OnAppCmd。
void CMyHtmlCtrl::OnAppCmd( LPCTSTR lpszWhere )
{
if (_tcsicmp(lpszWhere, _T(\"ok\"))==0)
{
GetParent()->SendMessage(WM_COMMAND,IDOK);
}
}
二、编程步骤
1、启动Visual C++6.0,生成一个单文档的应用程序,命名为\"ShowHtml\";
2、修改程序中的\"About\"对话框资源,在其中放置一个Static控件,设置它的ID为IDC_HTMLVIEW;
3、向程序中添加HTML文件资源,其ID设置为\"About.htm\";
4、向程序中添加CHtmlCtrl、CMyHtmlCtrl类文件;
5、在CAbout类中增加一个CMyHtmlCtrl类的对象m_page,并使用CLASSWIZARD重载CAbout类的OnInitDialog()函数;
6、编译运行程序。