找回密码
 立即注册
查看: 27|回复: 0

Directx游戏中嵌入IE浏览器实现过程

[复制链接]

15

主题

2

回帖

81

积分

管理员

积分
81
发表于 6 天前 | 显示全部楼层 |阅读模式
前言
因为近期有需求需要在D3D游戏中嵌入IE浏览器,先不说具体有什么用,先说如何实现,我们都知道D3D引擎主流实现方法是UI渲染和D3D模型分别渲染,IE浏览器如果说使用内核重写的话,通过D3D UI接口通过渲染来实现,比较麻烦,但是我可以通过IWebBrowser2接口通过Activex插件方式来嵌入浏览器, 对于不是特别复杂的要求,完全可以满足我们的需要,下面就开始。


一、为什么不使用MFC方式嵌入浏览器到D3D游戏中?
我们都知道,D3D一般都使用标准WINDOWS库,而且MFC共享库和标准库头文件同时引用会出现很多莫名奇妙的问题,为了保持代码纯净和便于维护,我们不使用MFC嵌入IE浏览器到D3D游戏中去。我们使用标准WINDOW库创建窗口。


二、使用步骤

1.引入头文件 (主要使用到IWebBrowser2接口和CComModule容器)

  1. #include <ExDisp.h>
  2. #include <atlbase.h>
  3. #include <atlwin.h>
复制代码
//创建IE接口变量和控件容器 可以在类中,也可以在全局定义

  1. CComModule _Module;
  2. IWebBrowser2* iWebBrowser;
  3. GUID Guid;
复制代码
2.导入库文件
  1. #pragma comment(lib,"atl")  
  2. #pragma comment(lib,"User32.lib")
复制代码
3.创建WINDOW窗口

此时要注意,我们创建的窗口D3D游戏窗口的子窗口,所以必须拿到游戏主进程的句柄和实例,拿到以后创建窗口,代码如下:

//参数分别为 游戏主进程实例,窗口资源ID,游戏主进程句柄,和IE窗口消息回调函数,此处我们暂时使用 CreateDialog 通过窗口资源ID创建资源的方式创建窗口。

//g_hInst是游戏实例,_g_hWnd是游戏进程句柄


  1. HWND m_hWndIExploerDlg=CreateDialog(g_hInst, MAKEINTRESOURCE(IDD_IEXPLOERDIALOG), _g_hWnd, IExploerDlgProc );       
复制代码
3.创建ActiveX IE控件容器

为什么要创建这个容器,因为C++创建的窗口,如果使用了ActiveX控件的话,必须使用容器来包裹ActiveX控件,然后窗口才可以成功加载,定义容器

//全局定义 放在CPP头文件下部,类定义前面

  1. BEGIN_OBJECT_MAP(ObjectMap)
  2. END_OBJECT_MAP()
  3. static CAxWindow WinContainer;
复制代码
4.将IE控件绑定到容器
  1. RECT rc;

  2. GetClientRect(m_hWndIExploerDlg, &rc);

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

  4. _Module.Init(ObjectMap,g_hInst,&Guid);

  5. WinContainer.Create(m_hWndIExploerDlg, rc, 0,WS_CHILD |WS_VISIBLE);

  6. WinContainer.CreateControl(pszName);

  7. WinContainer.QueryControl(__uuidof(IWebBrowser2),(void**)&iWebBrowser);
复制代码
5.设置IE控件URL 注意wchar_t 到char的转换
  1. wchar_t * Urlwchar = char2wchar(Url);

  2. VARIANT varMyURL;

  3. VariantInit(&varMyURL);

  4. varMyURL.vt = VT_BSTR;

  5. varMyURL.bstrVal = SysAllocString(Urlwchar);

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

  7. VariantClear(&varMyURL);
复制代码
6. IE窗口消息回调函数定义
  1. INT_PTR CALLBACK IExploerDlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);


  2. INT_PTR CALLBACK IExploerDlgProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
  3. {
  4. switch(message)
  5. {
  6. case WM_INITDIALOG:
  7. case WM_CREATE:
  8.         {

  9.         }
  10.         return TRUE;
  11. case WM_SETFONT:
  12. case DS_SETFONT:
  13. case DS_SHELLFONT:
  14.         {

  15.         }
  16.         return TRUE;
  17. case WM_CLOSE:
  18.         {
  19.                 IEDLGMGR->ShowIExplorerDialog(FALSE);
  20.         }
  21.         return TRUE;
  22. }
  23. return FALSE;
  24. }
复制代码
7. 在需要的地方,显示和隐藏IE插件
  1. if(!m_hWndIExploerDlg)  return;

  2. if(bShow)
  3. {
  4.         ShowWindow( m_hWndIExploerDlg, SW_SHOW);
  5. }
  6. else
  7. {
  8.         ShowWindow( m_hWndIExploerDlg, SW_HIDE);
  9. }
复制代码
总结

然后就可以在D3D游戏中嵌入IE窗口了,IE内核和用户的IE版本保持保持一致的,可以通过IWebBrowser2接口进行POST和GET以及与游戏对象和内存以及网络进行交互,可以实现充值等操作。




您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|软件开发编程门户 ( 陇ICP备2024013992号-1|甘公网安备62090002000130号 )

GMT+8, 2024-12-5 10:34 , Processed in 0.055072 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表