MFC里NewWindow2Explorer1的一些常用处理代码,FreeEIM部分代码。
void CADSLTryDlg::NewWindow2Explorer1(LPDISPATCH* ppDisp, BOOL* Cancel)
{
// TODO: 在此处添加消息处理程序代码
IUnknown* pUnk =this->m_oIExplorer.GetControlUnknown();
if(pUnk)
{
IDispatch* pDisp = NULL;
HRESULT hr = pUnk->QueryInterface(IID_IDispatch, (void**)&pDisp);
if(SUCCEEDED(hr)&&pDisp)
{
*ppDisp=pDisp;
*Cancel = FALSE;
}
}
在此NewWindow2事件代码中,档一个新常口需要被创建, 我们建立一个新的当前窗体Form1的拷贝. 在此表单窗体, 相当于Internet Explorer的新实例,将处理导航.
在mfc中我们需要首先加入NewWindow2 事件的映射条目到视图类的事件映射宏. (不要忘记包含 ExDispID.h in, 那里有DISPID_NEWWINDOW2 定义.)
ON_EVENT(CMfcWebHostView, IDC_WEBBROWSER, DISPID_NEWWINDOW2,
OnNewWindow2, VTS_PDISPATCH VTS_PBOOL)
下一步声明OnNewWindow2 方法:
void OnNewWindow2(LPDISPATCH* ppDisp, BOOL* Cancel);
最后实现OnNewWindow2 方法以创建一个新的MfcWebHost窗口实例:
void CMfcWebHostView::OnNewWindow2(LPDISPATCH FAR* ppDisp, BOOL FAR* Cancel){ // Ensure that ppDisp is not NULL. // If it is NULL, you probably specified // VT_DISPATCH for the first parameter in // the ON_EVENT macro for NewWindow2 in // the event sink map. The correct parameter // type is VT_PDISPATCH. // ASSERT(ppDisp); if (!ppDisp) return; // Get a pointer to the application object // for this application. // CWinApp* pApp = AfxGetApp(); // Get the correct document template. // CDocTemplate* pDocTemplate; POSITION pos = pApp->GetFirstDocTemplatePosition(); pDocTemplate = pApp->GetNextDocTemplate(pos); ASSERT(pDocTemplate); // Create the new frame. CFrameWnd* pNewFrame = pDocTemplate->CreateNewFrame(GetDocument(), (CFrameWnd*)AfxGetMainWnd()); ASSERT(pNewFrame); // Activate the frame, and set its active view. // pDocTemplate->InitialUpdateFrame(pNewFrame, NULL); CMfcWebHostView* pWbView = (CMfcWebHostView*)pNewFrame->GetActiveView(); ASSERT(pWbView); *ppDisp = pWbView->m_webBrowser.GetApplication();}
如果你在sid或者mdi应用程序中控制一个WebBrowser控件,实现OnNewWindow2 方法是复杂的且需要知道如何解决同文档模版如何工作. 或许, 如果你在一个给予对话框的应用程序控制一个WebBrowser控件是较为容易的.此处为示例:
void CMyDlg::OnNewWindow2(LPDISPATCH FAR* ppDisp, BOOL FAR* Cancel) { m_dlgNewWB = new CMyDlg; m_dlgNewWB->Create(IDD_MYDLG_DIALOG); *ppDisp = m_dlgNewWB->m_webBrowser.GetApplication();}
记住当你完成打开的新对话框后删除(delete) m_dlgNewWB. 且不要在CMyDlg::OnInitDialog方法中导航, 因为这样代码将不会工作.