三、程序代码
 
  ////////////////////////////////////////////////////CHtmlCtrl类的头文件; #include "afxhtml.h" class CHtmlCtrl : public CHtmlView {  public:   CHtmlCtrl() { }   ~CHtmlCtrl() { }   //使CHtmlCtrl控件与静态控件建立关联;   BOOL CreateFromStatic(UINT nID, CWnd* pParent);    virtual void PostNcDestroy() { }   //重载下面两个函数,旁路ChtmlView类的文档视图结构;   afx_msg void OnDestroy();   afx_msg int OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT msg);   // 实现"app"伪协议;   virtual void OnBeforeNavigate2( LPCTSTR lpszURL,    DWORD nFlags,    LPCTSTR lpszTargetFrameName,    CByteArray& baPostedData,    LPCTSTR lpszHeaders,    BOOL* pbCancel );    virtual void OnAppCmd(LPCTSTR lpszWhere);    DECLARE_MESSAGE_MAP();    DECLARE_DYNAMIC(CHtmlCtrl) };
  //////////////////////////////////////////////CHtmlCtrl类的实现文件; #include "StdAfx.h" #include "HtmlCtrl.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif IMPLEMENT_DYNAMIC(CHtmlCtrl, CHtmlView) BEGIN_MESSAGE_MAP(CHtmlCtrl, CHtmlView) ON_WM_DESTROY() ON_WM_MOUSEACTIVATE() END_MESSAGE_MAP() BOOL CHtmlCtrl::CreateFromStatic(UINT nID, CWnd* pParent) {  CStatic wndStatic;  if (!wndStatic.SubclassDlgItem(nID, pParent))   return FALSE;  // 获取静态控件的尺寸,并销毁该控件的窗口;  CRect rc;  wndStatic.GetWindowRect(&rc);  pParent->ScreenToClient(&rc);  wndStatic.DestroyWindow();  // 创建一个HtmlView控件;  return Create(NULL, // class name    NULL, // title   (WS_CHILD | WS_VISIBLE ), // style   rc, // rectangle   pParent, // parent   nID, // control ID   NULL); // frame/doc context not used }
  void CHtmlCtrl::OnDestroy() {  if (m_pBrowserApp) {释放浏缆器的m_pBrowserApp成员变量;   m_pBrowserApp->Release();   m_pBrowserApp = NULL;  }  CWnd::OnDestroy(); // bypass CView doc/frame stuff }
  int CHtmlCtrl::OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT msg) {  //旁路文档视图结构;  return CWnd::OnMouseActivate(pDesktopWnd, nHitTest, msg); }
  //////////////////实现"app"伪协议; void CHtmlCtrl::OnBeforeNavigate2( LPCTSTR lpszURL,  DWORD nFlags,  LPCTSTR lpszTargetFrameName,  CByteArray& baPostedData,  LPCTSTR lpszHeaders,  BOOL* pbCancel ) {  const char APP_PROTOCOL[] = "app:";  int len = _tcslen(APP_PROTOCOL);  if (_tcsnicmp(lpszURL, APP_PROTOCOL, len)==0) {   OnAppCmd(lpszURL + len);   *pbCancel = TRUE;  } }
  void CHtmlCtrl::OnAppCmd(LPCTSTR lpszWhere) {  // default: do nothing }
  ///////////////////////////////////////////////////// class CMyHtmlCtrl : public CHtmlCtrl {  virtual void OnAppCmd(LPCTSTR lpszWhere); };
  /////////////////// 处理HTML文件上的 "app:ok"链接,关闭对话框; void CMyHtmlCtrl::OnAppCmd(LPCTSTR lpszWhere) {  if (_tcsicmp(lpszWhere,_T("ok"))==0) {   GetParent()->SendMessage(WM_COMMAND,IDOK);  } } //////////////////////////////////////// class CAboutDlg : public CDialog {  public:   CAboutDlg();   CMyHtmlCtrl m_page;   // Dialog Data   //{{AFX_DATA(CAboutDlg)    enum { IDD = IDD_ABOUTBOX };   //}}AFX_DATA   // ClassWizard generated virtual function overrides   //{{AFX_VIRTUAL(CAboutDlg)  protected:   virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support   //}}AFX_VIRTUAL   // Implementation  protected:   //{{AFX_MSG(CAboutDlg)    virtual BOOL OnInitDialog();   //}}AFX_MSG  DECLARE_MESSAGE_MAP() };
  CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) {  //{{AFX_DATA_INIT(CAboutDlg)  //}}AFX_DATA_INIT }
  void CAboutDlg::DoDataExchange(CDataExchange* pDX) {  CDialog::DoDataExchange(pDX);  //{{AFX_DATA_MAP(CAboutDlg)  //}}AFX_DATA_MAP }
  BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)  //{{AFX_MSG_MAP(CAboutDlg)  //}}AFX_MSG_MAP END_MESSAGE_MAP()
  // App command to run the dialog void CShowHtmlApp::OnAppAbout() {  CAboutDlg aboutDlg;  aboutDlg.DoModal(); }
  BOOL CAboutDlg::OnInitDialog()  {  CDialog::OnInitDialog();  VERIFY(CDialog::OnInitDialog());  VERIFY(m_page.CreateFromStatic(IDC_HTMLVIEW, this));  m_page.LoadFromResource(_T("ABOUT.HTM"));  return TRUE;  } |  
    四、小结
    在上述实例中,读者朋友还可以在HTML文件中作其他的链接,诸如:app:cancel, app:refresh, 或 app:whatever等等,并且在OnAppCmd中编写自己的代码来处理 "cancel"、"refresh"、和"whatever"等字符串。参照例子程序,将自己的About对话框改进一番吧。如果有兴趣的话,您甚至可以利用这个技术来实现复活节彩蛋。           
     
  说明:本教程来源互联网或网友上传或出版商,仅为学习研究或媒体推广,wanshiok.com不保证资料的完整性。 
  2/2   首页 上一页 1 2  |