摘要:截至MFC 9.0(Visual Studio 2008)Beta1版本为止CHtmlView还不支持Windows XP SP2中IE新增的NewWindow3事件,但是在atlmfc\src\viewhtml.cpp源代码里面已经有了其他事件的处理代码,要加上NewWindow3的支持也很简单。 添加下面几行到你对CHtmlView的派生类的声明内 (在此示例中姑且名为CHtmlViewTestView) void NewWindow3( IDispatch **ppDisp, VARIANT_BOOL *Cancel, DWORD dwFlags, BSTR bstrUrlContext, BSTR bstrUrl ); DECLARE_EVENTSINK_MAP() 添加下面几行到你对CHtmlViewTestView的实现源文件 #include <exdisp.h> //For IWebBrowser2* and others#include <exdispid.h>#include <Mshtml.h>#include <Mshtmdid.h>#include <shobjidl.h> BEGIN_EVENTSINK_MAP(CHtmlViewTestView, CHtmlView) ON_EVENT(CHtmlViewTestView, AFX_IDW_PANE_FIRST,DISPID_NEWWINDOW3,NewWindow3,VTS_PDISPATCH VTS_PBOOL VTS_I4 VTS_BSTR VTS_BSTR)END_EVENTSINK_MAP() void CHtmlViewTestView::NewWindow3( IDispatch **ppDisp, VARIANT_BOOL *Cancel, DWORD dwFlags, BSTR bstrUrlContext, BSTR bstrUrl){ CDocTemplate* pDocTemplate=GetDocument()->GetDocTemplate(); CDocument* pDocument=pDocTemplate->OpenDocumentFile(NULL); POSITION pos= pDocument->GetFirstViewPosition(); CHtmlViewTestView* pNewView=(CHtmlViewTestView*)pDocument->GetNextView(pos); pNewView->SetRegisterAsBrowser(TRUE); *ppDisp=pNewView->GetApplication();} 在CHtmlView派生类里面处理ShowHtmlDialog比较麻烦一点,需要扩展控件站点,但是MFC对控件站点的扩展是不可复用的。MFC里面的两个浏览器控件封装类 CHtmlView和CDHtmlDialog甚至没有共享任何代码,而是使用几乎相同的代码来做完全一样的事情:重定向IDocHostUIHandler 的方法。CHtmlView用的扩展叫做 CHtmlControlSite,甚至都不在MFC头文件里面,而CDHtmlDialog用的 CBrowserControlSite在afxdhtml.h这个文件里面,暴露了GetInterfaceHook,留下了一点扩展的空间。 现在回到CHtmlView。要创建一个控件站点的扩展,你需要重载CWnd::CreateControlSite。这个函数是在MFC 7.0里面为扩展浏览器空间量身定做的,但是在MFC 8.0里面也被用于嵌入.Net里面的Windows Forms控件。 BOOL CHtmlViewTestView::CreateControlSite(COleControlContainer* pContainer, COleControlSite** ppSite, UINT /* nID */, REFCLSID /* clsid */){ ASSERT(ppSite != NULL); *ppSite = new......[
阅读全文]