C++中嵌入ie浏览器总结(1) - ie边框 及上下文菜单

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浏览器总结(1) - ie边框 及上下文菜单)