Directx遊戲中嵌入IE瀏覽器實現過程

全棧胖叔叔發表於2020-12-28

提示:文章寫完後,目錄可以自動生成,如何生成可參考右邊的幫助文件


前言

因為近期有需求需要在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以及與遊戲物件和記憶體以及網路進行互動,可以實現充值等操作。

相關文章