<A href="ok"><IMG ...></A>
当用户单击它时,浏览器显示这个“OK”文件,但是在显示之前,控制先执行CHtmlCtrl::OnBeforeNavigate2。CHtmlCtrl能够在这个函数中做想做的任何事情。
void CMyHtmlCtrl::OnBeforeNavigate2( LPCTSTR lpszURL, ..., BOOL* pbCancel) { if (_tcscmp(lpszURL,_T("ok"))==0) { // "ok" clicked: *pbCancel=TRUE; // abort // will close dialog GetParent()->SendMessage(WM_COMMAND,IDOK); }}
其实“OK”并不是什么文件;它只是一个很特殊的名字,CHtmlCtrl将它看作是“OK”按钮。为了实现这个想法,程序中创建了一个叫app:的冒充协议来代替“OK”,在about.htm中实际的链接是app:ok。每当浏览器导航到app:somewhere的时候,CHtmlCtrl都以“somewhere”为参数调用一个虚函数:CHtmlCtrl::OnAppCmd。
void CMyHtmlCtrl::OnAppCmd( LPCTSTR lpszWhere ){ if (_tcsicmp(lpszWhere, _T("ok"))==0) {GetParent()->SendMessage(WM_COMMAND,IDOK); } }
您可以在HTML文件中作其他的链接,诸如:app:cancel, app:refresh, 或 app:whatever等等,并且在OnAppCmd中编写自己的代码来处理 “cancel”、“refresh”、和“whatever” 、 字符串,它有点象在VB中编程。
参照例子程序,将自己的About对话框改进一番吧。如果有兴趣的话,您甚至可以利用这个技术来实现复活节彩蛋。