1. 程式人生 > >VC,webbrowser控制元件中彈出新網頁視窗

VC,webbrowser控制元件中彈出新網頁視窗

用webbrowser控制元件瀏覽網頁時,常彈出新的網頁視窗,若不做任何控制的話,會在預設瀏覽器(一般是IE)中開啟,這樣就在新的視窗打開了,原程式就很難控制了,且存在webbrowser控制元件和IE的session共享問題。解決方法是讓新開啟的網頁在自己的對話方塊中開啟,具體步驟如下:



一、新建基於對話方塊的MFC程式,對話方塊ID為IDD_SHELL_DIALOG,新增Microsoft Web Browser控制元件(ID為IDC_EXPLORER),並利用嚮導生成IDC_EXPLORER的控制元件型變數m_webBrowser,Navigate()就可以連線要瀏覽的網頁了。







[cpp] view plaincopy

VARIANT vInfo;

VariantInit(&vInfo);

m_webBrowser.Navigate("http://×××", &vInfo, &vInfo, &vInfo, &vInfo);





二、要為彈出的網頁也新建一個對話方塊(ID為IDD_DIALOG_NEW),利用嚮導新增類生成CNewDlg類( : public CDialog)。



並在該對話方塊中新增Microsoft Web Browser控制元件(ID為IDC_EXPLORER_NEW),



利用嚮導生成IDC_EXPLORER的控制元件型變數m_newwebBrowser,



三、在原對話方塊(IDD_SHELL_DIALOG)中新增webbrowser控制元件(IDC_EXPLORER)的NewWindow3()事件,當事件觸發時,顯示新對話方塊,並用新的對話方塊中的webbrowser控制元件(IDC_EXPLORER_NEW)開啟URL地址就行了



[cpp] view plaincopy

void CShellDlg::NewWindow3Explorer(LPDISPATCH* ppDisp, BOOL* Cancel, unsigned long dwFlags, LPCTSTR bstrUrlContext, LPCTSTR bstrUrl)

{

// TODO: 在此處新增訊息處理程式程式碼

* Cancel = TRUE;

VARIANT vInfo;

CNewDlg * newdlg = new CNewDlg;

newdlg->Create(IDD_DIALOG_NEW);

newdlg->ShowWindow(SW_SHOW);

newdlg->m_newwebBrowser.Navigate(bstrUrl, &vInfo, &vInfo, &vInfo, &vInfo);

}





四、萬一在新視窗中操作又產生新視窗,咋辦?那就仿照第三步在新對話方塊(IDD_DIALOG_NEW)中新增webbrowser控制元件(IDC_EXPLORER_NEW)的NewWindow3()事件,反正新視窗是new的,只要一個模板就行了,不必再新增新對話方塊了。



[cpp] view plaincopy

void CNewDlg::NewWindow3ExplorerNew(LPDISPATCH* ppDisp, BOOL* Cancel, unsigned long dwFlags, LPCTSTR bstrUrlContext, LPCTSTR bstrUrl)

{

// TODO: 在此處新增訊息處理程式程式碼

* Cancel = TRUE;

VARIANT vInfo;

CNewDlg * newdlg = new CNewDlg;

newdlg->Create(IDD_DIALOG_NEW);

newdlg->ShowWindow(SW_SHOW);

newdlg->m_newwebBrowser.Navigate(bstrUrl, &vInfo, &vInfo, &vInfo, &vInfo);

}

注意:我把下面這些程式碼去掉之後就可以了

VARIANT vInfo;

CNewDlg * newdlg = new CNewDlg;

newdlg->Create(IDD_DIALOG_NEW);

newdlg->ShowWindow(SW_SHOW);

newdlg->m_newwebBrowser.Navigate(bstrUrl, &vInfo, &vInfo, &vInfo, &vInfo);

此時程式可以編譯過,但是當開啟新視窗時,並不會進入到OnNewWindow3Explorer1函式中;經過分析發現把事件定義稍微改一下即可

ON_EVENT(CTestIeDlg, IDC_EXPLORER1, 273 /* NewWindow3 */, OnNewWindow3Explorer1, VTS_PDISPATCH VTS_PBOOL VTS_BSTR VTS_BSTR)
改為下面內容:

ON_EVENT(CTestDlg, IDC_EXPLORER1, 273 /* NewWindow3 */, OnNewWindow3Explorer1, VTS_PDISPATCH VTS_PBOOL VTS_I4 VTS_BSTR VTS_BSTR)