技术备忘录

c++及图形学

 

2009年2月21日

解决 activex 需要激活的方法

用脚本来输出object , 文章http://www.sitepoint.com/article/activex-activation-issue-ie/ 解决了flash 的问题,也可以用来处理自己的activex

posted @ 2009-02-21 20:29 jerrychan 阅读(372) | 评论 (0)编辑 收藏

2008年12月20日

C++中嵌入ie浏览器总结(4) - 对话框拖动

     前面忘了写这个问题,就是对话框的拖动问题。就像我前面的图片展示的对话框,一般的windows对话框是可以拖着标题栏移动的,但是我们这里没有任何原来的标题栏了,只有html页面,怎么拖呢? 好像有点麻烦。
       冥思苦想之后,想到一种办法,通过前面的接口给c++发指令,让c++移动窗口,页面上计算好拖动的距离。html里面页面的拖动还是比较简单的,c++里面移动也就是调用 MoveWindow。由于前面的通讯方法还是比较灵活,没用多少时间,就把这个功能实现了。但是一运行看,不太对劲,拖动过程拖尾现象太明显。可能是c++不断调用 MoveWindow 重绘效率比较低。这可麻烦了。这时候,突然想到普通对话框拖动的时候,是一个虚框在那里动,原来的对话框是不动的,鼠标放开后,对话框才移过去。 能不能做到这样呢? 但是windows实现这个方法的细节不得而知,怎么做呢? 
       还是google好啊,经过一番搜索,找到了答案: 
  
void TooltipDlg::moveWin( const std::vector<wxString> &args )
{
    
if(args.size()<2return;
    
long x,y;
    args[
0].ToLong(&x);
    args[
1].ToLong(&y);
    
int ix,iy;
    ix 
= x;
    iy 
= y;
    ClientToScreen(
&ix,&iy);
 

    ::SendMessage((HWND)
this->GetHWND(),WM_NCMOUSEMOVE,HTCAPTION,MAKELPARAM(ix, iy)); 

}
   搞定了,简单吧,真是没想到这么简单。运行后发现,真的和windows的对话框移动一模一样了,太好了

今天一鼓作气把前面几天的工作都总结了下来,还真是敲得手有点累。但是这些东西确实是不太常规的方法,找解决问题的方法很难,这里先把他们记录下来,免得以后找不到了。以前确实有很多知识都是用了就丢一边找不到了。 也希望给有类似疑问的朋友一个帮助。

posted @ 2008-12-20 23:08 jerrychan 阅读(2389) | 评论 (2)编辑 收藏

C++中嵌入ie浏览器总结(3) - wxIE 的 bug解决及最后效果展示

       前面两个问题的解决,心里想: 这下好了,解决了这两个问题,下一步做界面就简单多了,不像以前,直接用mfc或第三方库做,要做出好看效果真是很难。编译好,运行了,发现效果还不错。但是实现到里面的脚本的时候,发现出了问题,不响应键盘消息了。而且在页面文本框里面按tab键,光标不是跑到下一个文本框,而是不见了。之前有这个现象,但是忙于解决前面的问题,没有注意到。这下可完了,不会前工尽弃吧,那可麻烦大了。
      google了半天,问了朋友,还是不知道什么原因。因为wxIE及嵌入浏览器本身是比较偏门的问题,确实很难找到答案。
      山穷水尽疑无路,柳暗花明又一村。好不容易,在google上找到了一个类似的问题,回答的说,这是wxIE的bug,在wxPython的项目中,这个问题已经解决了。下载下来编译后,运行试试看,搞定了
      但是还得和之前的修改合并,合并过程中又发现了一个问题。前文中提到过,通过IOleObject 接口来设置IDocHostUIHandler方法,我开始就是用这种方法。结果合并完后,发现还是不响应键盘消息
    调了半天,才发现,wxIE原来已经实现过IOleClientSite 接口,我把自己的接口设上去,把wxIE的给替换掉了,所以导致了不正常的结果。 经过一番调整后,终于正常了
   自此,用html做c++程序界面的基础工作算是告一段落了,下面就是完成接口工作和页面脚本了。希望不要再遇到什么问题。
     我在这里把这些问题记录下来,以备以后查用,也愿其他朋友不要再遇到我一样的困扰。

    下面截一张做出来的界面图:


这是一个对话框,完成前面的基础工作后,只要设计师设计好页面,我们几分钟就可以继承到c++里面,再花点写接口和脚本的时间,比原来用mfc做界面,不知要节省多少时间。这个界面比较简单,但是只要是能设计出的界面,我们都能让他集成进来。
有兴趣的朋友也不妨试试这种做界面的方法。

posted @ 2008-12-20 22:56 jerrychan 阅读(2849) | 评论 (5)编辑 收藏

C++中嵌入ie浏览器总结(2) - 双向通讯

     摘要:    第一步解决了边框和上下文菜单问题,第二部就是要解决c++程序和html页面交互的问题。最开始的想法是通过c++去更新页面内容的方式来完成c++->html的通讯,通过BeforeNavigate2 接口,截获页面url地址的方式来完成html->c++的通讯。但是这种方式存在以下缺点:       ...  阅读全文

posted @ 2008-12-20 22:26 jerrychan 阅读(3826) | 评论 (1)编辑 收藏

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 @ 2008-12-20 22:00 jerrychan 阅读(4321) | 评论 (12)编辑 收藏

开张大吉!

        
      [本来这是写在博客园的,也是前天刚申请,但是发现那里基本都是.net,java之类的,我毕竟还是以c++为主,所以就搬到这里来了 ]

      从大二开始接触编程算起来,也差不多快十年时间了,这么多年的也写了不少的代码,看过不少的书和资料。但是一直没有尝试去把自己所看过的和学到的东西记录下来。最近,朋友建议我把开发中的心得和学到的东西记录下来,以便大家交流,因此产生了用博客作为记录方式的想法。       
         开设这个博客,一方面是记录自己的学习的心得体会和新知识,以备日后查用,另一方面是可以和广大的朋友切磋和交流。 
         记得从小学开始,就对写作文感到很头疼,而每次暑假都要写几篇作文,所以每次快开学的时候,就要绞尽脑汁的去凑够一定的字数,最后往往都成了记流水账。高中时候,由于写的基本都是八股文式作文,就是提出观点,分析观点,因为逻辑推理方面还可以,所以虽然写不出高质量的文章,但是凑数还不算是难事。所以博客虽然流行了这么多年,很多朋友也开设自己的博客,我一直还没有自己的博客。这个博客算是我人生中的第一个博客! 这个博客定位为技术博客,所以对文笔要求相对要低些。 
         啰嗦了这么多,我还是先介绍一下我自己的技术方面的兴趣和关注点。 
         编程语言方面,刚开始接触编程是从vb开始的,vb简单易学,很容易上手。后来接触了fortran,c,pascal, 再后来是c++,java, 网页编程用到过asp,jsp,javascript等,.net接触的不太多。现在主要是做c++方面的,有时候会做些java,javascript相关的web开发 
         技术方面,做过网络、音视频、p2p、ajax、struts、3D图形学,还是比较杂的,最近主要做3D图形学方面的研究和开发,也准备作为以后比较长期的一个方向,欢迎有相同兴趣的朋友一起交流学习。 
         开张演说就到此为止,下面开始自由交流 :)

posted @ 2008-12-20 20:15 jerrychan 阅读(1060) | 评论 (5)编辑 收藏

仅列出标题  

导航

统计

常用链接

留言簿(7)

随笔分类

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜