使用CDHtmlDialog的对话框程序,重载OnBeforeNavigate(LPDISPATCH pDisp, LPCTSTR szUrl);当szUrl是某些指定的链接时,就不显示该页面,在OnBeforeNavigate函数中加入DisconnectDHtmlEvents();依然不起作用,请大家指点一下,谢谢!

解决方案 »

  1.   

    CHtmlView,慢慢折腾吧,我很多细节的问题没法回忆。
      

  2.   


    CHtmlView,重载OnBeforeNavigate2,很容易解决,但是在CDHtmlDialog上不知道怎么弄啊
      

  3.   

    如果在 OnBeforeNavigate 中设置一个断点,你再看调用堆栈,就会发现他的父类CDHtmlDialog其实也是通过OnBeforeNavigate2事件来实现的,只是他忽略了大多数参数
    void CDHtmlDialog::_OnBeforeNavigate2(LPDISPATCH pDisp, VARIANT FAR* URL, VARIANT FAR* Flags, VARIANT FAR* TargetFrameName, VARIANT FAR* PostData, VARIANT FAR* Headers, BOOL FAR* Cancel)
    {
    Flags; // unused
    TargetFrameName; // unused
    PostData; // unused
    Headers; // unused
    Cancel; // unused CString str(V_BSTR(URL));
    OnBeforeNavigate(pDisp, str);
    }
    因此你可以自己处理这个事件
    .h 加入 
    DECLARE_EVENTSINK_MAP()
    void _OnBeforeNavigate2(LPDISPATCH pDisp, VARIANT FAR* URL, VARIANT FAR* Flags, VARIANT FAR* TargetFrameName, VARIANT FAR* PostData, VARIANT FAR* Headers, BOOL FAR* Cancel);.cpp 加入
    BEGIN_EVENTSINK_MAP(CDHTMLDlgTestDlg, CDHtmlDialog)
      ON_EVENT(CDHTMLDlgTestDlg, AFX_IDC_BROWSER, 250 /* BeforeNavigate2 */, _OnBeforeNavigate2, VTS_DISPATCH VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PBOOL)
    END_EVENTSINK_MAP()void CDHTMLDlgTestDlg::_OnBeforeNavigate2(LPDISPATCH pDisp, VARIANT FAR* URL, VARIANT FAR* Flags, VARIANT FAR* TargetFrameName, VARIANT FAR* PostData, VARIANT FAR* Headers, BOOL FAR* Cancel)
    {
      Flags; // unused
      TargetFrameName; // unused
      PostData; // unused
      Headers; // unused
      //Cancel; // unused
      *Cancel = TRUE; //这里非零就可以阻止进一步操作  CString str(V_BSTR(URL));
      OnBeforeNavigate(pDisp, str);
    }
      

  4.   


    该方法我早就试过,却是起作用,但是只要DECLARE_EVENTSINK_MAP(),那么BEGIN_DHTML_EVENT_MAP就不起作用,也就是说,html中的button,onButton事件就没用了,不知道怎么回事。
      

  5.   

    我创建默认的项目,测试没有问题啊
    // DHTMLDlgTestDlg.h : 头文件
    //#pragma once
    // CDHTMLDlgTestDlg 对话框
    class CDHTMLDlgTestDlg : public CDHtmlDialog
    {
    // 构造
    public:
      CDHTMLDlgTestDlg(CWnd* pParent = NULL);  // 标准构造函数// 对话框数据
      enum { IDD = IDD_DHTMLDLGTEST_DIALOG, IDH = IDR_HTML_DHTMLDLGTEST_DIALOG };  protected:
      virtual void DoDataExchange(CDataExchange* pDX);  // DDX/DDV 支持  HRESULT OnButtonOK(IHTMLElement *pElement);
      HRESULT OnButtonCancel(IHTMLElement *pElement);// 实现
    protected:
      HICON m_hIcon;  // 生成的消息映射函数
      virtual BOOL OnInitDialog();
      afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
      afx_msg void OnPaint();
      afx_msg HCURSOR OnQueryDragIcon();
      DECLARE_MESSAGE_MAP()
      DECLARE_DHTML_EVENT_MAP()
      DECLARE_EVENTSINK_MAP()public:
      void _OnBeforeNavigate2(LPDISPATCH pDisp, VARIANT FAR* URL, VARIANT FAR* Flags, VARIANT FAR* TargetFrameName, VARIANT FAR* PostData, VARIANT FAR* Headers, BOOL FAR* Cancel);
      void _OnNavigateComplete2(LPDISPATCH pDisp, VARIANT FAR* URL);
      void _OnDocumentComplete(LPDISPATCH pDisp, VARIANT* URL);
    };// DHTMLDlgTestDlg.cpp : 实现文件
    //#include "stdafx.h"
    #include "DHTMLDlgTest.h"
    #include "DHTMLDlgTestDlg.h"#ifdef _DEBUG
    #define new DEBUG_NEW
    #endif
    // 用于应用程序“关于”菜单项的 CAboutDlg 对话框class CAboutDlg : public CDialog
    {
    public:
      CAboutDlg();// 对话框数据
      enum { IDD = IDD_ABOUTBOX };  protected:
      virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持// 实现
    protected:
      DECLARE_MESSAGE_MAP()
    };CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
    {
    }void CAboutDlg::DoDataExchange(CDataExchange* pDX)
    {
      CDialog::DoDataExchange(pDX);
    }BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
    END_MESSAGE_MAP()
    // CDHTMLDlgTestDlg 对话框BEGIN_DHTML_EVENT_MAP(CDHTMLDlgTestDlg)
      DHTML_EVENT_ONCLICK(_T("ButtonOK"), OnButtonOK)
      DHTML_EVENT_ONCLICK(_T("ButtonCancel"), OnButtonCancel)
    END_DHTML_EVENT_MAP()BEGIN_EVENTSINK_MAP(CDHTMLDlgTestDlg, CDHtmlDialog)
      ON_EVENT(CDHTMLDlgTestDlg, AFX_IDC_BROWSER, 252 /* NavigateComplete2 */, _OnNavigateComplete2, VTS_DISPATCH VTS_PVARIANT)
      ON_EVENT(CDHTMLDlgTestDlg, AFX_IDC_BROWSER, 250 /* BeforeNavigate2 */, _OnBeforeNavigate2, VTS_DISPATCH VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PBOOL)
      ON_EVENT(CDHTMLDlgTestDlg, AFX_IDC_BROWSER, 259 /* DocumentComplete */, _OnDocumentComplete, VTS_DISPATCH VTS_PVARIANT)
    END_EVENTSINK_MAP()void CDHTMLDlgTestDlg::_OnBeforeNavigate2(LPDISPATCH pDisp, VARIANT FAR* URL, VARIANT FAR* Flags, VARIANT FAR* TargetFrameName, VARIANT FAR* PostData, VARIANT FAR* Headers, BOOL FAR* Cancel)
    {
      Flags; // unused
      TargetFrameName; // unused
      PostData; // unused
      Headers; // unused
      Cancel; // unused
      //*Cancel = TRUE; //  CString str(V_BSTR(URL));
      OnBeforeNavigate(pDisp, str);
    }void CDHTMLDlgTestDlg::_OnNavigateComplete2(LPDISPATCH pDisp, VARIANT FAR* URL)
    {
      ASSERT(V_VT(URL) == VT_BSTR);  CString str(V_BSTR(URL));  OnNavigateComplete(pDisp, str);
    }void CDHTMLDlgTestDlg::_OnDocumentComplete(LPDISPATCH pDisp, VARIANT* URL)
    {
      ASSERT(V_VT(URL) == VT_BSTR);  CString str(V_BSTR(URL));
      OnDocumentComplete(pDisp, str);
    }
    CDHTMLDlgTestDlg::CDHTMLDlgTestDlg(CWnd* pParent /*=NULL*/)
      : CDHtmlDialog(CDHTMLDlgTestDlg::IDD, CDHTMLDlgTestDlg::IDH, pParent)
    {
      m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    }void CDHTMLDlgTestDlg::DoDataExchange(CDataExchange* pDX)
    {
      CDHtmlDialog::DoDataExchange(pDX);
    }BEGIN_MESSAGE_MAP(CDHTMLDlgTestDlg, CDHtmlDialog)
      ON_WM_SYSCOMMAND()
      //}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    // CDHTMLDlgTestDlg 消息处理程序BOOL CDHTMLDlgTestDlg::OnInitDialog()
    {
      CDHtmlDialog::OnInitDialog();  // 将“关于...”菜单项添加到系统菜单中。  // IDM_ABOUTBOX 必须在系统命令范围内。
      ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
      ASSERT(IDM_ABOUTBOX < 0xF000);  CMenu* pSysMenu = GetSystemMenu(FALSE);
      if (pSysMenu != NULL)
      {
        BOOL bNameValid;
        CString strAboutMenu;
        bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
        ASSERT(bNameValid);
        if (!strAboutMenu.IsEmpty())
        {
          pSysMenu->AppendMenu(MF_SEPARATOR);
          pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
        }
      }  // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
      //  执行此操作
      SetIcon(m_hIcon, TRUE);      // 设置大图标
      SetIcon(m_hIcon, FALSE);    // 设置小图标  // TODO: 在此添加额外的初始化代码  return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
    }void CDHTMLDlgTestDlg::OnSysCommand(UINT nID, LPARAM lParam)
    {
      if ((nID & 0xFFF0) == IDM_ABOUTBOX)
      {
        CAboutDlg dlgAbout;
        dlgAbout.DoModal();
      }
      else
      {
        CDHtmlDialog::OnSysCommand(nID, lParam);
      }
    }// 如果向对话框添加最小化按钮,则需要下面的代码
    //  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
    //  这将由框架自动完成。void CDHTMLDlgTestDlg::OnPaint()
    {
      if (IsIconic())
      {
        CPaintDC dc(this); // 用于绘制的设备上下文    SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);    // 使图标在工作区矩形中居中
        int cxIcon = GetSystemMetrics(SM_CXICON);
        int cyIcon = GetSystemMetrics(SM_CYICON);
        CRect rect;
        GetClientRect(&rect);
        int x = (rect.Width() - cxIcon + 1) / 2;
        int y = (rect.Height() - cyIcon + 1) / 2;    // 绘制图标
        dc.DrawIcon(x, y, m_hIcon);
      }
      else
      {
        CDHtmlDialog::OnPaint();
      }
    }//当用户拖动最小化窗口时系统调用此函数取得光标
    //显示。
    HCURSOR CDHTMLDlgTestDlg::OnQueryDragIcon()
    {
      return static_cast<HCURSOR>(m_hIcon);
    }HRESULT CDHTMLDlgTestDlg::OnButtonOK(IHTMLElement* /*pElement*/)
    {
      OnOK();
      return S_OK;
    }HRESULT CDHTMLDlgTestDlg::OnButtonCancel(IHTMLElement* /*pElement*/)
    {
      OnCancel();
      return S_OK;
    }