DirectX 文本绘制
在Direct中进行文本绘制,可以通过Win32程序框架实现,也可以通过DXUT进行绘制。
基于第一篇的Win32框架入门实现非常简单,只需要添加数行代码即可。主要说需要修改的地方。
#pragma comment(lib,"dxerr.lib")
#pragma comment(lib,"dxguid.lib")
#pragma comment(lib,"d3dx9d.lib")
#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"winmm.lib")
//#pragma comment(lib,"comct132.lib")
#include <Windows.h>
#include <d3d9.h>
#include <d3dx9core.h>
//////////////////////////////////////////////////////////////////////////
//D3D基础对象;
LPDIRECT3D9 g_pD3D = NULL;
//D3D设备对象;
LPDIRECT3DDEVICE9 g_pd3dDevice = NULL;
//字体对象;
LPD3DXFONT g_pD3dFont=0;
WCHAR* strText = L"DirectX9 字体显示";
//绘制区域对象;
RECT clientRect;
//----------------------------//
//初始d3d对象;
//----------------------------//
HRESULT InitializeD3D(HWND hwndTemp){
if (NULL==(g_pD3D=Direct3DCreate9(D3D_SDK_VERSION)))
{
return false;
}
//设置d3dpreame参数 用来创建d3d设备对象;
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp,sizeof(d3dpp));
d3dpp.Windowed = true;//窗口模式;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
if (FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hwndTemp,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&g_pd3dDevice)))
{
return false;
}
//创建字体对象;
if (FAILED(D3DXCreateFont(g_pd3dDevice,0,0,0,0,0,0,0,0,0,L"楷体",&g_pD3dFont)))
{
return false;
}
GetClientRect(hwndTemp,&clientRect);
return true;
}
///渲染图象///////////////////////////////////////////////////////////////////////
VOID Render(){
g_pd3dDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(45,50,170),1.0f,0);
if (SUCCEEDED(g_pd3dDevice->BeginScene()))
{ //绘画文字;
g_pD3dFont->DrawText(NULL,strText,-1,&clientRect,DT_SINGLELINE|DT_NOCLIP|DT_CENTER|DT_VCENTER,0xffffffff);
g_pd3dDevice->EndScene();
}
g_pd3dDevice->Present(NULL,NULL,NULL,NULL);
}
///结束释放资源///////////////////////////////////////////////////////////////////////
VOID CleanUp(){
//释放字体对象;
if(!g_pD3dFont){
g_pD3dFont->Release();
}
if(!g_pd3dDevice){
g_pd3dDevice->Release();
}
if(!g_pD3D){
g_pD3D->Release();
}
}
///处理消息循环///////////////////////////////////////////////////////////////////////
LRESULT WINAPI MsgProc(HWND hwnd,UINT msgid, WPARAM wParam, LPARAM LParam){
switch(msgid){
case WM_DESTROY:
CleanUp();
PostQuitMessage(0);
return 0;
case WM_KEYUP:
//新添加的按键响应;
if (wParam==VK_ESCAPE)
{ //esc键退出;
CleanUp();
PostQuitMessage(0);
}
if (wParam==VK_SPACE)
{ //esc键退出;
strText =L"敲击回车键了";
Render();
ValidateRect(hwnd,NULL);
}
break;
case WM_PAINT:
//渲染场景;
Render();
ValidateRect(hwnd,NULL);
return 0;
}
return DefWindowProc(hwnd,msgid,wParam,LParam);
}
///创建windows窗口///////////////////////////////////////////////////////////////////////
INT WINAPI WinMain(HINSTANCE hint,HINSTANCE,LPSTR,INT){
WNDCLASSEX wc={sizeof(WNDCLASSEX),CS_CLASSDC,MsgProc,0L,0L,GetModuleHandle(NULL),NULL,NULL,NULL,NULL,L"ClassName",NULL};
RegisterClassEx(&wc);
HWND hwnd = CreateWindow(L"ClassName",L"D3D游戏编程",WS_OVERLAPPEDWINDOW ,200,100,600,500,NULL,NULL,wc.hInstance ,NULL);
if (SUCCEEDED(InitializeD3D(hwnd)))
{
ShowWindow(hwnd,SW_SHOWDEFAULT);
UpdateWindow(hwnd);
MSG msg;
ZeroMemory(&msg,sizeof(msg));
while(msg.message!=WM_QUIT){
if (PeekMessage(&msg,NULL,0U,0U,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
Render();
}
}
}
UnregisterClass(L"ClassName",wc.hInstance);
return 0;
}
//////////////////////////////////////////////////////////
通过上面的代码和第一篇的DirectX3D入门来比较,只是添加了数行代码而已。实现起来并不复杂;
在DirectX中绘制字体有2个函数【D3DXCreateFontIndirect & D3DXCreateFont】前者利用也有的字体库进行创建,后者根据指定参数进行绘制。
我们用到了D3DXCreateFont,他的函数原型如下:
D3DXCreateFont(
LPDIRECT3DDEVICE9 pDevice, //指向IDirect3DDevice9的指针 他将与创建的字体对象进行关联;
INT Height, //字体的逻辑高度,我们传入的0表示默认值;
UINT Width, //字体的逻辑宽度,0同样表示字体的默认值;
UINT Weight, //字体的权重,一般设为0;
UINT MipLevels, //MipMap的级别,字体一般设0;
BOOL Italic, //是否斜体,1是0否;
DWORD CharSet, //字体所属的字符集,0自动匹配;
DWORD OutputPrecision, //字体的输出精度;
DWORD Quality, //字体的输出质量;
DWORD PitchAndFamily, //字符的索引号;
LPCWSTR pFaceName, //表示字体名称的字符串;
LPD3DXFONT* ppFont); //指向ID3DXFont对象的实例指针;
在上面的InitializeD3D方法中我们完成了设置,并通过GetClientRect获得当前渲染区域讯息。然后接下来就在Render方法中进行了绘制。
在MsgProc方法中,我们新添加了2个按键响应。一个esc退出,一个空格键改变字体内容的。


DirectX 文本绘制的更多相关文章
- iOS上文本绘制的几种方法
文本绘制在开发客户端程序中是一个比较常用的功能,可分为采用控件和直接绘制两种方式. 采用控件的方式比较简便,添加一个比如UILabel对象,然后设置相关属性就好了.但这种方式局限性也比较大. 直接绘制 ...
- Linux OpenGL 实践篇-16 文本绘制
文本绘制 本文主要射击Freetype的入门理解和在OpenGL中实现文字的渲染. freetype freetype的官网,本文大部分内容参考https://www.freetype.org/fre ...
- PIE属性表多字段的文本绘制
最近研究了PIE SDK文本元素的绘制相关内容,因为在我们的开发中,希望可以做到在打开一个Shp文件后,读取到属性表的所有字段,然后可以选择一些需要的字段,将这些字段的所有要素值的文本,绘制到shp图 ...
- Direct3D 2D文本绘制
现在学习下Direct3D在窗口中绘制一些文本信息,ID3DXFont接口负责创建字体和绘制二维的文本.我们介绍下ID3DXFont的用法. 1.创建LPD3DXFONT接口 LPD3DXFONT g ...
- Canvas文本绘制
文字绘制: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- 『备注』GDI+ 绘制文本有锯齿,透明背景文本绘制
背景: GDI+ 绘制文本 时,如果 背景是透明的 —— 则会出现 锯齿. //其实,我不用这三个 属性 好多年了 //而且,这三个属性 在关键时刻还有可能 帮倒忙 //关键是:这三个属性,鸟用都没有 ...
- SVG.js 文本绘制整理
1.SVG.Text var draw = SVG('svg1').size(300, 300); //画文字内容展示 //var text = draw.text('中文内容测试\n换行处理'); ...
- Duilib 控件类html富文本绘制
转载:http://blog.csdn.net/wyansai/article/details/51088896 转载:http://blog.csdn.net/lixiang987654321/ar ...
- 用DirectX 11绘制一个Cube
之前一篇文章讲了如何初始化DirectX 11,现在在此基础上绘制一个Cube,总体可概括为以下几个步骤: 定义Cube顶点数据结构 创建Vertex Buffer和Index Buffer 编写应用 ...
随机推荐
- struts2视频学习笔记 22-23(基于XML配置方式实现对action的所有方法及部分方法进行校验)
课时22 基于XML配置方式实现对action的所有方法进行校验 使用基于XML配置方式实现输入校验时,Action也需要继承ActionSupport,并且提供校验文件,校验文件和action类 ...
- CSS3 Media Queries
Media Queries直译过来就是“媒体查询”,在我们平时的Web页面中head部分常看到这样的一段代码: <link href="css/reset.css" rel= ...
- eclipse 项目修改和更新项目,回退版本,解决分支的冲突的办法
一个关于git的图 1.我在github建立了3个分支. 2.把其中一个分支拉到本地. 项目修改提交到远程库 3.修改完代码以后commit项目,点击项目右击->team->commit ...
- 一致性哈希算法——算法解决的核心问题是当slot数发生变化时,能够尽量少的移动数据
一致性哈希算法 摘自:http://blog.codinglabs.org/articles/consistent-hashing.html 算法简述 一致性哈希算法(Consistent Hashi ...
- return false取消手机移动端的默认设置
想做一个语音界面,当长按语音按钮的时候,总会出现移动端什么复制粘贴菜单.然后在JS中加入return false后就消失了,感觉好神奇哦~
- 为什么 Node.js 这么火,而同样异步模式 Python 框架 Twisted 却十几年一直不温不火?
twisted是一个强大的异步网络框架,应用的面也非常广,但是没有这几年才出现的Node.js火,社区.文档也是很少可怜我觉得二者其实在本质上差不多,而且python使用起来还是比较容易一些的 匿名用 ...
- 在单元测试中指定log4j的配置文件
在开发过程中,我们会使用到log4j来输出日志,我们希望在单元测试的时候,只看到部分日志信息,或者定义日志输出的级别. 这个时候手工指定log4j的配置文件: 具体做法如下: 定义类如下: i ...
- php和AJAX用户注册演示程序
<! doctype html public "-//w3c//dtd html 4.0//en" "http://www.w3.org/tr/rec-html14 ...
- MySql避免全表扫描【转】
原文地址:http://blog.163.com/ksm19870304@126/blog/static/37455233201251901943705/ 对查询进行优化,应尽量避免全表扫描,首先应考 ...
- sql删除多余重复的数据只保留一条
delete from people where peopleName in (select peopleName from people group by peopleName ...