win32 不使用MFC用IWebBrowser2做浏览器的另一种方法

发布时间:2018年2月24日 作者:未知 查看次数:1165


参考:http://blog.csdn.net/nervecell2/article/details/40480053


用win32 api以及IWebBrowser2这个com组件来创建一个浏览器应用,这边所用的开发工具还是用vs2010。(VC6)

打开vs2010,文件->新建->项目->Visual C++->Win32项目,项目的名称就接点地气,取名为Cocos2dxWebBrowser,一路下一步直到完成。自动完成的向导会生成Cocos2dxWebBrowser.cpp这个文件,在这个文件的开头处加入以下代码


  1. #include "stdafx.h"  

  2. #include "Cocos2dxWebBrowser.h"  

  3. //以下代码就是要加的头文件以及需要导入的库文件  

  4. #include <atlbase.h>  

  5. #include <atlwin.h>    

  6. #include <windows.h>    

  7. #pragma comment(lib,"atl")    

  8. #pragma comment(lib,"User32.lib")    

  9. CComModule _Module;  //这个是必要的,不要忘记 


找到WndProc这个窗口函数,加入以下变量

  1. RECT rc;    

  2. IWebBrowser2* iWebBrowser;    

  3. VARIANT varMyURL;    

  4. static CAxWindow WinContainer;  

  5. LPOLESTR pszName = OLESTR("shell.Explorer.2");    

  6. GetClientRect(hWnd, &rc); 


static CAxWindow WinContainer; 

CAxWindow是一个ActiveX控件,ActiveX控件这玩意知名度最高的估计是Flash插件以及Flash播放器。这边过多的细节就不展开,这边只要记住需要用这个ActiveX窗口做为浏览器的容器。


LPOLESTR pszName = OLESTR("shell.Explorer.2"); 

这边所做的只是字符串之间的转换,如果你了解win32 sdk中关于Unicode和 Ascii的各种恩怨情仇,这句话你就能明白。当然这种恩怨情仇各种初学者都经历过。


GetClientRect(hWnd, &rc); 

这一句更是经典的获取当前窗口客户区大小的函数,所谓的客户区是指去掉标题栏、菜单栏以及状态栏之后的可见区域。当你按照向导生成的代码,编译运行后会看到一个菜单栏加一块白色的区域,那个白色的区域就是客户区。


VARIANT varMyURL; 

VARIANT顾名思义就是变量的意思,这个变量是对当前语言体系中所有变量在类层次上的分装,待会会为这个变量分配一个字符串,用它来表示需要打开的URL。


接着再在swicth中加入WM_CREATE消息和创建浏览器的代码

  1. case WM_CREATE:{  

  2.     WinContainer.Create(hWnd, rc, 0,WS_CHILD |WS_VISIBLE);    

  3.     WinContainer.CreateControl(pszName);    

  4.     WinContainer.QueryControl(__uuidof(IWebBrowser2),(void**)&iWebBrowser);     

  5.     VariantInit(&varMyURL);    

  6.     varMyURL.vt = VT_BSTR;     

  7.     varMyURL.bstrVal = SysAllocString(_T("http://www.baidu.com"));    

  8.     iWebBrowser-> Navigate2(&varMyURL,0,0,0,0);    

  9.     VariantClear(&varMyURL);     

  10.     iWebBrowser-> Release();     

  11.     } 


  1. WinContainer.Create(hWnd, rc, 0,WS_CHILD |WS_VISIBLE);    

  2. WinContainer.CreateControl(pszName);    

  3. WinContainer.QueryControl(__uuidof(IWebBrowser2),(void**)&iWebBrowser);

以上先用CAxWindow创建一个窗体,该窗体作为当前窗体的子窗体,接着根据之前COM组件的名字来创建一个控件(也许是组件),这个名字也就是shell.Explorer.2,即IE浏览器的COM名字,下一步是把生成好的控件的指针赋值给iWebBrowser,通过指针的指针方式来赋值。


  1. VariantInit(&varMyURL);    

  2. varMyURL.vt = VT_BSTR;     

  3. varMyURL.bstrVal = SysAllocString(_T("http://www.baidu.com")); 

以上是为varMyURL这个VARIANT这个变量赋值,赋值的过程是要先初始化,接着把类型申明为字符串类型也就是VT_BSTR,最终用SysAllocString分配了一段字符串。这边过多细节可以不必深入,只要知道具体怎么用就好了,因为不是奔着COM来的。


  1. iWebBrowser-> Navigate2(&varMyURL,0,0,0,0);    

  2. VariantClear(&varMyURL);     

  3. iWebBrowser-> Release(); 

最后调用IWebBrowser2的Navigate2来打开URL,以及一些收尾的工作。

自此用win32 api创建浏览器的过程就完成了,各位可以编译试试看。


===================

我用的以下

WinContainer.Create(hWnd, rc, 0,WS_CHILD |WS_VISIBLE | WS_CLIPCHILDREN);

WinContainer.CreateControlEx(L"{8856F961-340A-11D0-A96B-00C04FD705A2}",NULL,NULL,&punkCtrl);

WinContainer.QueryControl(__uuidof(IWebBrowser2),(void**)&iWebBrowser);





版权所有!www.sieye.cn
E.Mail:sieye@sohu.com QQ:66697110