C++中嵌入ie浏览器总结(1) - ie边框 及上下文菜单
最近项目中用html 来做界面,也就折腾了一下在wxwidget中嵌入浏览器的若干细节工作,mfc也基本是类似的,由于wxwidget中已经做了一个封装wxie,但是开发过程中也遇到了不少问题,在此做一下总结:
1.ie边框 及上下文菜单
普通嵌入到程序里面的浏览器页面都会有一个灰色的边框,这样放到程序里面就很难看。目前网上流行的办法添加css:
body{
border:0;
} 但是这个方法的缺点是,必须要把页面头部的dtd申明去掉。网上的错误提法是类似以下链接的: http://www.faceker.com/200801/webbrowser-no-border.html 这里面讲,只要把头部改成:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 但是目前很多页面用了比较新的css,改成这样后,页面就无法正常显示了。让网页美工改样式? 真是有点困难。
后来继续查阅了资料,发现比较好的办法,那就是重载 IDocHostUIHandler 接口,其中,实现以下部分:
HRESULT STDMETHODCALLTYPE FrameSite::GetHostInfo(DOCHOSTUIINFO *pInfo)
{
pInfo->cbSize = sizeof(DOCHOSTUIINFO);
pInfo->dwFlags = DOCHOSTUIFLAG_NO3DBORDER|DOCHOSTUIFLAG_SCROLL_NO;
pInfo->dwDoubleClick = DOCHOSTUIDBLCLK_DEFAULT;
return S_OK;
} 其中 DOCHOSTUIFLAG_NO3DBORDER 就表示不要生成边框,DOCHOSTUIFLAG_SCROLL_NO 表示不要生成滚动条
这样就可以比较完美的解决边框和滚动条的问题,不用依赖页面的调整 。让设计师爱用什么用什么。
另外一个就是禁用右键菜单,网上也有不少办法,但是用这个接口可以很简单的实现:
HRESULT STDMETHODCALLTYPE FrameSite::ShowContextMenu(DWORD dwID, POINT *ppt,
IUnknown *pcmdtReserved, IDispatch *pdispReserved)
{
HRESULT result = S_FALSE; //Dont Interfere
BOOL handled = FALSE;
switch ( m_contextMenuMode )
{
case kDefaultMenuSupport:
break;
case kNoContextMenu:
result = S_OK;
handled = TRUE;
break;
case kTextSelectionOnly:
if (dwID != CONTEXT_MENU_TEXTSELECT)
{
result = S_OK;
handled = TRUE;
}
break;
case kAllowAllButViewSource:
if (dwID == CONTEXT_MENU_DEFAULT)
{
//result = ModifyContextMenu(dwID, ppt, pcmdtReserved);
handled = TRUE;
}
break;
case kCustomMenuSupport:
if (dwID == CONTEXT_MENU_DEFAULT)
{
//result = CustomContextMenu(ppt, pcmdtReserved);
handled = TRUE;
}
break;
}
if (! handled)
{
result = S_FALSE;
}
return result;
} 这里不仅可以控制右键菜单显示,m_contextMenuMode = kNoContextMenu,还可以做到自定义菜单显示,m_contextMenuMode =其他值。因为暂时还不需要自定义菜单,所以这里没有实现。
如果用wxie,就在FrameSite类增加这个接口即可,不关注的接口直接返回S_FALSE 或E_NOTIMPL;
如果用sdk或mfc,可以 调用IOleObject 的SetClientSite 方法,设置一个继承了IOleClientSite 和 IDocHostUIHandler 的接口。
C++中嵌入ie浏览器总结(2) - 双向通讯
第一步解决了边框和上下文菜单问题,第二部就是要解决c&#