《VC技术内幕》里第八章有一个例子,在一个view窗口里创建两个WebBrowser的对象,当点击右侧页面的链接时,在左侧进行显示。我照着把程序输入,编译运行。但是发现,点击链接后,并不象预想中的那样在左侧显示,而是直接跳出一个新的ie界面。请问各位,如果要达到预期效果该怎么做?为什么会出现这种现象呢?是与所使用的控件有关吗?我用的系统是2k professional,书上所用的控件是ie4.x的,问题是不是出在这里?谢谢。

解决方案 »

  1.   

    问题不在这里,而在于OnNewWindow2函数你没作处理。加入以下代码:
    void CMyHtmlView::OnNewWindow2(LPDISPATCH* ppDisp, BOOL* Cancel) 
    {
       // Get a pointer to the application object.
       CWinApp* pApp = AfxGetApp();   // Get the correct document template.
       POSITION pos = pApp->GetFirstDocTemplatePosition();
       CDocTemplate* pDocTemplate = pApp->GetNextDocTemplate( pos );   // Create a new frame.
       CFrameWnd* pFrame = pDocTemplate->CreateNewFrame(
                                              GetDocument(),
                                              (CFrameWnd*)AfxGetMainWnd() );   // Activate the frame.
       pDocTemplate->InitialUpdateFrame( pFrame, NULL );
       CNewWindow2View* pView = (CNewWindow2View*)pFrame->GetActiveView();   // Pass pointer of WebBrowser object.
       pView->SetRegisterAsBrowser( TRUE );
       *ppDisp = pView->GetApplication();   
    }其中CNewWindow2View就是你左侧的View
      

  2.   

    感谢这位兄台。我可能没有说清楚,在这个程序里,只有一个View,在这个View里包含两个CWebBrowser对象,相关的程序如下(CWebBrowser是Microsoft Web Browser控件)://Ex08BView.h
    class CEx08BView : public CView
    {
    protected: // create from serialization only
    CEx08BView();
    DECLARE_DYNCREATE(CEx08BView)//... 这两个函数分别由两个WebBrowser对象响应
    afx_msg void OnBeforeNavigateExplorer1(LPCTSTR URL,\
    long Flags, LPCTSTR TargetFrameName, VARIANT FAR* PostData,\
    LPCTSTR Headers, BOOL FAR* Cancel);
    afx_msg void OnTitleChangeExplorer2(LPCTSTR Text);
    DECLARE_EVENTSINK_MAP()
    private:
    static const char s_engine[]; //搜索引擎
    CWebBrowser m_target;         //用来显示结果的页面
    CWebBrowser m_search;         //搜索页面
    };//Ex08BView.cpp
    //...
    BEGIN_EVENTSINK_MAP(CEx08BView, CView)
    ON_EVENT(CEx08BView, ID_BROWSER_SEARCH, 100, OnBeforeNavigateExplorer1, 
                  VTS_BSTR VTS_I4 VTS_BSTR VTS_PVARIANT VTS_BSTR VTS_PBOOL)
    ON_EVENT(CEx08BView, ID_BROWSER_TARGET, 113,OnTitleChangeExplorer2, 
                  VTS_BSTR)
    END_EVENTSINK_MAP()const char CEx08BView::s_engine[]="http://www.msn.com/";//...问题在这里,这个函数似乎从来就没有被调用过,debug也没见有什么反应
    void CEx08BView::OnBeforeNavigateExplorer1(LPCTSTR URL,\
    long Flags, LPCTSTR TargetFrameName, VARIANT FAR* PostData,\
    LPCTSTR Headers, BOOL FAR* Cancel)
    {
    TRACE("CEx08BView::OnBeforeNavigateExplorer1--URL=%s\n", URL);
    if(!strnicmp(URL, s_engine, strlen(s_engine)))
    {
    return;
    }

    m_target.Navigate(URL, NULL, NULL, PostData, NULL);
    *Cancel=TRUE;
    }//这个就更不用说了,不执行
    void CEx08BView::OnTitleChangeExplorer2(LPCTSTR Text)
    {
        CWnd* pWnd=AfxGetApp()->m_pMainWnd;
    if(pWnd!=NULL)
    if(::IsWindow(pWnd->m_hWnd))
    pWnd->SetWindowText(Text);
    }到底该怎么办呢?谢谢!
      

  3.   

    你的ID_BROWSER_SEARCH和ID_BROWSER_TARGET可以从你的Web Browser控件那边发送过来吗?
    我看好像是不行的,这两个消息好像根本就不发送到你的View中,你自然接收不到,你把以上代码加到CMainFrame里面试试