MFC D3D绘制中文

添加头文件

#include <windows.h>
#include <d3d9.h>
#include <d3dx9.h>

#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")

定义变量:

private:
	IDirect3D9 *pDirect9;
	IDirect3DDevice9 *pDevice9;
	LPD3DXFONT g_font;

使用类向导添加WM_CLOSE,WM_TIMER

在OnInitDialog()里面添加

pDirect9 = Direct3DCreate9(D3D_SDK_VERSION);
	if (pDirect9)
	{
		D3DPRESENT_PARAMETERS dp;
		dp.BackBufferWidth = 640;                                   //后备缓冲表面的宽度(以像素为单位)  
		dp.BackBufferHeight = 480;                                  //后备缓冲表面的高度(以像素为单位)  
		dp.BackBufferCount = 1;                                     //后备缓冲表面的数量,通常设为“1”,即只有一个后备表面  
		dp.BackBufferFormat = D3DFMT_A8R8G8B8;                      //后备缓冲表面的像素格式(如:32位像素格式为D3DFMT——A8R8G8B8)  
		dp.MultiSampleType = D3DMULTISAMPLE_NONE;                   //全屏抗锯齿的类型,详情请看SDK  
		dp.MultiSampleQuality = 0;                                  //全屏抗锯齿的质量等级,详情看SDK  
		dp.SwapEffect = D3DSWAPEFFECT_DISCARD;                      //指定表面在交换链中是如何被交换的,取D3DSWAPEFFECT枚举类型中的一个成员。其中D3DSWAPEFFECT_DISCARD是最有效的  
		dp.hDeviceWindow = m_hWnd;
		dp.Windowed = true;                                         //设为true则为窗口模式,false则为全屏模式  
		dp.EnableAutoDepthStencil = true;                           //设为true,D3D将自动创建深度/模版缓冲  
		dp.AutoDepthStencilFormat = D3DFMT_D24S8;                   //深度/模版缓冲的格式  
		dp.Flags = 0;                                               //一些附加特性,设为0或D3DPRESENTFLAG类型的一个成员。下列两个最常用的标志全部的标志请查阅SDK:  
		dp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;    //刷新率,设定D3DPRESENT_RATE_DEFAULT使用默认刷新率  
		dp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;    //属于D3DPRESENT成员,又有两个常用标志,其余请查SDK:D3DPRESENT_INTERVAL_IMMEDIATE——立即交换.D3DPRESENT_INTERVAL_DEFAULT——D3D选择交换速度,通常等于刷新率  
		
		pDirect9->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, m_hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &dp, &pDevice9);
	}
	SetTimer(0, 100, NULL);


定时器函数:

if (pDevice9){
		pDevice9->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_ARGB(255, 255, 0, 0), 1.0f, 0),
		pDevice9->BeginScene();

		D3DXFONT_DESC df;
		ZeroMemory(&df, sizeof(D3DXFONT_DESC));
		df.Height = 25;
		df.Width = 12;
		df.Weight = 100;
		df.MipLevels = D3DX_DEFAULT;
		df.Italic = false;
		df.CharSet = DEFAULT_CHARSET;
		df.Quality = 0;
		df.PitchAndFamily = 0;
		wcscpy(df.FaceName, L"宋体");
		//创建ID3DXFont 接口对象  
		D3DXCreateFontIndirect(pDevice9, &df, &g_font);
		//居中绘制文本  
		RECT g_FontPosition = { 0, 0, 300, 300 };
		g_font->DrawText(NULL, L"深圳", -1, &g_FontPosition,
			DT_CENTER | DT_VCENTER, D3DCOLOR_XRGB(255, 255, 255));

		pDevice9->EndScene();
		pDevice9->Present(NULL, NULL, m_hWnd, NULL);
	}


退出

if (pDirect9){
		pDirect9->Release();
	}
	if (pDevice9){
		pDevice9->Release();
	}

	KillTimer(0);

效果图:


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下更改相对于 E_D3D9 1.0正式版: 1:[!]"E_D3D9" 改名为“E_DirectX".为其他DirectX组件作准备. 2:[!]调用"d3dx9_42.dll"库改为"d3dx9_39.dll"库.直接影响相关的ID3DX...类. 3:[!]优化各类(修改为继承),删除与基类重复的方法,相对减少源码体积(不多,约20KB). 3:[+]ID3DXPMesh 之前版本漏掉了(MSDN内没有,d3dx9mesh.h中有). 4 [+]ID3DXSPMesh 之前版本漏掉了(MSDN内没有,d3dx9mesh.h中有). 5:[+]IDirect3D9Ex 6:[+]IDirect3DDevice9Ex 7:[+]IDirect3DSwapChain9Ex 8:[+]IDirect3D9ExOverlayExtension 9:[+]IDirect3DDevice9Video 10:[+]IDirect3DAuthenticatedChannel9 11:[+]IDirect3DCryptoSession9 12:[+]IDirectInput8 13:[+]IDirectInputDevice8 其中DIDATAFORMAT参考了Delphi的JEDI后处理的.若有更好的方法欢迎讨论. 14:[+]IDirectInputEffect 15:[*]日后会陆续添加DirectX的其余组件,并且修复现有问题. (以后版本会整合发布,改动都将写入日志,公开免费发布,以谋求易语言完美调用原生DirectX所有组件方法. 待组件全了后,我会定期逐个类/方法测试,顺便写些Demo.) 提示: 有易友建议我使用EATL,我大致看了下原理是类似的.但它改写了易语言的类(也是其亮点),从而导致可以直接调用. 对于E_DirectX这个项目来讲,我个人感觉意义不是很大(该处理的类型还得处理!). 并不是说EATL不好,本人多重考虑后感觉不适合. 许多类方法可能存在问题 务必注意 特征/情况如下: 方法中参数类型为文本型、字节集、所有类型的数组、以及自定义类型成员中含有其他自定义类型的,这些未经处理的大多存在问题. 还有小数型参数与返回值的问题("Call"的问题),第一个版本(E_D3D9 Beta1)中存在此重大问题.其后续的版本基本都已修复. 以上问题基本皆由易独特的类型存储结构无法与之匹配而引起的.(了解C++类型存储结构的小伙伴可以很快想到处理办法.) 模块还有大量问题没有处理,本人没有那么多时间和精力去逐个测试,除了自己用到的方法以外,许多都是简单处理下(工作量异常大! 无奈之举,以后慢慢修复吧.也可以自己参照我处理过的方法自行研究,开源也是有此目的.) 若发现问题可以发送相关的代码到我的邮箱. (此文最底下或模块中的作者信息一栏),便于我整合进下一版本中. 承诺: 以后所有版本皆会以免费开源形式发布,可任意使用,无任何限制.(据我所知之前也有不少因此受益的小伙伴,才让我更有信心继续下去.) 声明: E_DirectX(E_D3D9) 从诞生以来一直是以无偿开源的形式存在,同时因此作者(Roc/xc.roc)也无法对产品和用户进行有效的约束或限制, 同时也不承担因为该产品所带来的后果,若造成任何损失/后果由使用者自行承担.请大家谨慎考虑取舍! 总而言之,一切如涛哥所言:"向正确的方向前进!". 动态: 本人最近根据某易友的建议正在开发Essen GUI(游戏界面库),主要是应用于游戏环境(Hook D3D - -!). 会以开源模块的形式小范围收费发布,并且给予相关技术支持.有相关需求的用户也可以联系我邮箱. 以后会建立相关Q群供用户交流. 大致特点:简单、易用、可扩展性(你能想到的,你能见到的组件几乎都能扩展出来.类似Ex_DUI,但也所有区别.).
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值