提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、为什么不使用MFC方式嵌入浏览器到D3D游戏中?
  • 二、使用步骤
    • 1.引入头文件 (主要使用到IWebBrowser2接口和CComModule容器)
    • 2.导入库文件
    • 3.创建WINDOW窗口
    • 3.创建ActiveX IE控件容器
    • 4.将IE控件绑定到容器
    • 5.设置IE控件URL 注意wchar_t 到char的转换
    • 6. IE窗口消息回调函数定义
    • 7. 在需要的地方,显示和隐藏IE插件
  • 总结

前言

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


一、为什么不使用MFC方式嵌入浏览器到D3D游戏中?

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

二、使用步骤

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

#include <ExDisp.h>
#include <atlbase.h>
#include <atlwin.h>

//创建IE接口变量和控件容器 可以在类中,也可以在全局定义

CComModule _Module;
IWebBrowser2* iWebBrowser;
GUID Guid;

2.导入库文件

代码如下(示例):

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

3.创建WINDOW窗口

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

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

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

HWND m_hWndIExploerDlg=CreateDialog(g_hInst, MAKEINTRESOURCE(IDD_IEXPLOERDIALOG), _g_hWnd, IExploerDlgProc );

3.创建ActiveX IE控件容器

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

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

BEGIN_OBJECT_MAP(ObjectMap)
END_OBJECT_MAP()
static CAxWindow WinContainer;

4.将IE控件绑定到容器

RECT rc;GetClientRect(m_hWndIExploerDlg, &rc);LPOLESTR pszName=OLESTR("shell.Explorer.2");_Module.Init(ObjectMap,g_hInst,&Guid);WinContainer.Create(m_hWndIExploerDlg, rc, 0,WS_CHILD |WS_VISIBLE); WinContainer.CreateControl(pszName);WinContainer.QueryControl(__uuidof(IWebBrowser2),(void**)&iWebBrowser);

5.设置IE控件URL 注意wchar_t 到char的转换

char * Url = “http://www.gansu.com/”;

wchar_t * Urlwchar = char2wchar(Url);VARIANT varMyURL;VariantInit(&varMyURL);varMyURL.vt = VT_BSTR;varMyURL.bstrVal = SysAllocString(Urlwchar);iWebBrowser->Navigate2(&varMyURL,0,0,0,0);VariantClear(&varMyURL);

6. IE窗口消息回调函数定义

INT_PTR CALLBACK IExploerDlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);INT_PTR CALLBACK IExploerDlgProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
{
switch(message)
{
case WM_INITDIALOG:
case WM_CREATE:{}return TRUE;
case WM_SETFONT:
case DS_SETFONT:
case DS_SHELLFONT:{}return TRUE;
case WM_CLOSE:{IEDLGMGR->ShowIExplorerDialog(FALSE);}return TRUE;
}
return FALSE;
}

7. 在需要的地方,显示和隐藏IE插件

if(!m_hWndIExploerDlg)  return;if(bShow)
{ShowWindow( m_hWndIExploerDlg, SW_SHOW);
}
else
{ShowWindow( m_hWndIExploerDlg, SW_HIDE);
}

总结

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

Directx游戏中嵌入IE浏览器实现过程相关推荐

  1. C++中嵌入ie浏览器总结 .

    C++中嵌入ie浏览器总结(1) - ie边框 及上下文菜单 最近项目中用html 来做界面,也就折腾了一下在wxwidget中嵌入浏览器的若干细节工作,mfc也基本是类似的,由于wxwidget中已 ...

  2. C++中嵌入ie浏览器

    转载自:http://www.360doc.com/content/13/0522/14/8236462_287267576.shtml 很不错的文章,原文保存 C++中嵌入ie浏览器总结(1) - ...

  3. 如何从8 道面试题中,看出浏览器渲染过程与性能优化

    前言 移动互联网时代,用户对于网页的打开速度要求越来越高.百度用户体验部研究表明,页面放弃率和页面的打开时间关系如下图 所示. 根据百度用户体验部的研究结果来看,普通用户期望且能够接受的页面加载时间在 ...

  4. 怎样在Winform窗体中嵌入Web浏览器

    背景 项目当中需要在Winform窗体中嵌入网页,虽然微软自带了WebBrowser控件,但是她是以IE模式运行的,兼容性实在太差,找了一圈发现有个叫CefSharp的家伙还不错,于是就拿来玩了一下. ...

  5. windows模拟键盘鼠标事件DirectX游戏中

    有一些使用DirectX接口的游戏程序,它们在读取键盘操作时绕过了windows的消息机制,而使用DirectInput.这是因为有些游戏对实时性控制的要求比较高,比如赛车游戏,要求以最快速度响应键盘 ...

  6. 使用 CefSharp 在 C# App 中嵌入 Chrome 浏览器

    介绍 以前曾试过在app中整合一个可靠又快速的web浏览器吗? 在本文中,你会学到如何轻松地将奇妙的CefSharp网页浏览器组件(基于Chromium)集成到你的C# app中. 然后,你可以使用此 ...

  7. cefsharp设置cookie_使用CefSharp在.Net程序中嵌入Chrome浏览器(八)——Cookie

    CEF中的Cookie是通过CookieManager来管理的,可以用它来设置发送的Cookie. 发送Cookie 发送Cookie的一个基本示例如下: var cookieManager = _c ...

  8. cocos2d 嵌入网页_在 cocos2d-x 中嵌入浏览器

    在 cocos2d-x 中嵌入浏览器 次阅读 Embeds a browser in cocos2d-x 在游戏中嵌入网页是很常见的需求,cocos2d-x 引擎官方并没有提供这个功能. 我在网上转了 ...

  9. Web3 游戏中的创造者经济:从游戏到平台,用户生成内容的挑战

    撰写:Joel John.Siddharth 编译:深潮 TechFlow 图片来源:由Maze AI工具生成 今天我们要探讨的是游戏.出于几个原因,游戏是为数不多的真正有机会在数字资产生态系统中扩展 ...

  10. Web3 游戏中的创造者经济:从游戏到平台 用户生成内容的挑战

    今天我们要探讨的是游戏.出于几个原因,游戏是为数不多的真正有机会在数字资产生态系统中扩展至十亿用户面向消费者的用例之一. 首先,游戏玩家已经习惯了数字资产:他们经常为游戏中的交易(即道具)付费. 其次 ...

最新文章

  1. 链表问题20——按照左右半区的方式重新组合单链表
  2. window7 ubuntu12.04 Opensuse13.04 三系统安装
  3. hadoop程序实例
  4. wms仓储系统培训_WMS系统开创智慧仓储新方向
  5. 在字符串String类型常忘记使用equals()进行值比较的问题
  6. python多进程队列中的队列_python 多进程队列数据处理详解
  7. c语言long double位数,int long double 所占位数 和最大值
  8. php编译支持mysql,编译php支持curl和pdo_mysql
  9. VS2013 MFC 直接将 OpenCV2.0/3.0 库中的 Mat 结构的图像传递到 Picture Control(图片控件)
  10. [转]Windows关机过程分析与快速关机
  11. 机器人伪装成人类在 GitHub 上为开源项目修复 bug
  12. Memcache的 简介
  13. 设计佣金问题的java程序_三角形、nextday、佣金问题实验报告.doc
  14. html 打开 app,h5页面打开app
  15. 「案例分析」生鲜行业B2B供应链平台开发案例
  16. 数据结构-六度空间(模拟六度分隔理论)
  17. 华为od与中软外包哪个更好_华为外包,不是OD,OD也烂,呆了8个月。今天离职再见,…...
  18. 计算机音乐青旅行,网易云音乐推荐:五一旅行途中必听的10首小清新
  19. [书籍精读]《移动WEB前端高级开发实践》精读笔记分享
  20. 用Java抓取RSS生成Mobi文件发送到Kindle

热门文章

  1. STM32状态机编程----什么是状态机?
  2. JavaScript判断数组中是否有重复元素方法
  3. ndk读取assets文件
  4. 单片机c语言内部ram移动,2012年微型计算机原理与接口技术自考题模拟(9)
  5. 泛函分析复习笔记(二)线性算子与线性泛函
  6. PIC单片机应用开发实践教程(三): MCU配置位与烧录
  7. linux个人游戏服务器搭建,linux游戏服务器搭建(一)
  8. 查看工作级计算机输入网络密码,怎么查看电脑用户名和密码
  9. SketchUp插件|ClothWorks布料模拟 免费下载!(草图大师制作窗帘张拉膜等)
  10. 互联网大厂的“中台战略”到底是什么?