技术备忘录

c++及图形学

 

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 的接口。
 

 

posted on 2008-12-20 22:00 jerrychan 阅读(4317) 评论(12)  编辑 收藏 引用 所属分类: C++

评论

# re: C++中嵌入ie浏览器总结(1) - ie边框 及上下文菜单 2008-12-21 09:58 forever

太好了 我试试  回复  更多评论   

# re: C++中嵌入ie浏览器总结(1) - ie边框 及上下文菜单 2008-12-21 11:48 小不点

那能不能让网页透明?半透明?主要滚动条可以透明么??期待恢复哦。thank!  回复  更多评论   

# re: C++中嵌入ie浏览器总结(1) - ie边框 及上下文菜单 2008-12-21 12:00 jerrychan

@小不点
半透明可能有点困难,所以这个方法还是有一点局限性 。想要半透明的话,用flash可以做到,不过好像也不是很容易。以后可能会用到flash来做界面,现在用html是考虑到他比较简单,页面也容易设计
  回复  更多评论   

# re: C++中嵌入ie浏览器总结(1) - ie边框 及上下文菜单 2008-12-21 12:39 小不点

是的,看过用flash做界面的,听说很多游戏里面的界面用flash,但是自己到还没发现过,只是看过有用html(网页)来做游戏界面,比如第三方的html渲染引擎,自己也考虑过用ie但是处理滚动条透明就是 没找到好办法~~  回复  更多评论   

# re: C++中嵌入ie浏览器总结(1) - ie边框 及上下文菜单 2008-12-21 16:40 jerrychan

@小不点
刚看到网上有个人提到用两个窗口来实现,一个窗口是实际的html页,隐藏不显示,另一个是显示页,把html的内容画上去,这样就可以用windows的半透明窗口来做了 。以后有空尝试一下
  回复  更多评论   

# re: C++中嵌入ie浏览器总结(1) - ie边框 及上下文菜单 2008-12-21 18:51 小不点

codeproject 上有个差不多的,他是把html绘制到一张图片上,然后自己实现透明之类的。图片大小知道了那么滚动跳自己就能实现了,意思是不是差不多?  回复  更多评论   

# re: C++中嵌入ie浏览器总结(1) - ie边框 及上下文菜单 2008-12-21 19:49 jerrychan

差不多,今天在wxwidget里面简单试了下,没有成功,可能是wx的问题,有兴趣你可以试一下。  回复  更多评论   

# re: C++中嵌入ie浏览器总结(1) - ie边框 及上下文菜单 2009-02-19 14:14 kaimu

博主您能不能公布一下您的WXIE的代码,由于找到的网上的代码和新版的wxactive不兼容,需要修改很多地方,望能给予帮助  回复  更多评论   

# re: C++中嵌入ie浏览器总结(1) - ie边框 及上下文菜单 2009-02-19 14:28 Jiad (jiadz@live.com)

期待博主分享一下修改过的wxActiveX的代码,目前想用wxWidgets+html+js做一个穿透式查询的报表模块,正好需要这个东西,不知博主能否开源?  回复  更多评论   

# re: C++中嵌入ie浏览器总结(1) - ie边框 及上下文菜单 2009-02-19 15:56 kaimu

顺便问下,我直接使用WXIE,会出现FrameSite无法实例化的问题,不知道能否解决?  回复  更多评论   

# re: C++中嵌入ie浏览器总结(1) - ie边框 及上下文菜单 2012-07-05 17:02 ma12155506

HTML->C++双向通信那 能否代码发我份 万分感谢谢谢  回复  更多评论   

# re: C++中嵌入ie浏览器总结(1) - ie边框 及上下文菜单 2012-07-05 17:02 ma12155506

双向通讯那代码能否 发我一份 258185589@qq.com  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

统计

常用链接

留言簿(7)

随笔分类

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜