VC,webbrowser控制元件中彈出新網頁視窗
阿新 • • 發佈:2018-12-30
用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)
一、新建基於對話方塊的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)