最近在使用CWebBrowserUI时,发现了几个问题,特此记录。
在xml中的标签如下:
- <WebBrowser name="ie" clsid="{8856F961-340A-11D0-A96B-00C04FD705A2}" delaycreate="false"/>
在程序中加载如下:
- CWebBrowserUI* pWebBrowser = static_cast<CWebBrowserUI*>(m_pm.FindControl(_T("ie")));
- if( pWebBrowser ) {
- pWebBrowser->Navigate2("http://www.baidu.com");
- }
通过这样加载后,相应的网页都能访问了,但使用后发现有如下几个问题:
1. 通过CTRL+C或者右键菜单都无法复制文字了
这个问题较容易处理,只需要在程序启动的地方添加 OleInitialize(NULL); 即可
2. 鼠标没有办法选中文字了
经过尝试,发现需要给browser设置CWebBrowserEventHandler才行[事实上这个在正式项目中是肯定会用上的],这里CWebBrowserUI默认是没有设置的,可以通过这样来解决[测试]:
- CWebBrowserUI* pWebBrowser = static_cast<CWebBrowserUI*>(m_pm.FindControl(_T("ie")));
- if( pWebBrowser ) {
- static CWebBrowserEventHandler handler;
- pWebBrowser->SetWebBrowserEventHandler(&handler);
- pWebBrowser->Navigate2("http://www.baidu.com");
- }
这里与 GetHostInfo 有关,在CWebBrowserUI中,此函数如下:
- STDMETHODIMP DuiLib::CWebBrowserUI::GetHostInfo( DOCHOSTUIINFO* pInfo )
- {
- if (m_pWebBrowserEventHandler)
- {
- return m_pWebBrowserEventHandler->GetHostInfo(pInfo);
- }
- return E_NOTIMPL;
- }
默认m_pWebBrowserEventHandler为空,所以返回了E_NOTIMPL导致无法选中任何文字,而这里设置后,返回了S_OK,就正常了。
转载路径 http://blog.csdn.net/tragicguy/article/details/23497099
设置了那个 setWebBrowserEventHandler() 之后,右键菜单没有了,怎么办?
需要处理:ShowContextMenu
- HRESULT STDMETHODCALLTYPE CMyBrowserEventHandler::ShowContextMenu(/* [in] */ DWORD dwID,/* [in] */ POINT __RPC_FAR *ppt,/* [in] */ IUnknown __RPC_FAR *pcmdtReserved,/* [in] */ IDispatch __RPC_FAR *pdispReserved)
- {
- //return E_NOTIMPL;
- //返回 E_NOTIMPL 正常弹出系统右键菜单
- //返回S_OK 则可屏蔽系统右键菜单
- //if(dwID == CONTEXT_MENU_TEXTSELECT || dwID == CONTEXT_MENU_CONTROL)
- // return E_NOTIMPL;
- return m_bShowContextMenu ? E_NOTIMPL : S_OK;
- }