在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 文本绘制的更多相关文章

  1. iOS上文本绘制的几种方法

    文本绘制在开发客户端程序中是一个比较常用的功能,可分为采用控件和直接绘制两种方式. 采用控件的方式比较简便,添加一个比如UILabel对象,然后设置相关属性就好了.但这种方式局限性也比较大. 直接绘制 ...

  2. Linux OpenGL 实践篇-16 文本绘制

    文本绘制 本文主要射击Freetype的入门理解和在OpenGL中实现文字的渲染. freetype freetype的官网,本文大部分内容参考https://www.freetype.org/fre ...

  3. PIE属性表多字段的文本绘制

    最近研究了PIE SDK文本元素的绘制相关内容,因为在我们的开发中,希望可以做到在打开一个Shp文件后,读取到属性表的所有字段,然后可以选择一些需要的字段,将这些字段的所有要素值的文本,绘制到shp图 ...

  4. Direct3D 2D文本绘制

    现在学习下Direct3D在窗口中绘制一些文本信息,ID3DXFont接口负责创建字体和绘制二维的文本.我们介绍下ID3DXFont的用法. 1.创建LPD3DXFONT接口 LPD3DXFONT g ...

  5. Canvas文本绘制

    文字绘制: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

  6. 『备注』GDI+ 绘制文本有锯齿,透明背景文本绘制

    背景: GDI+ 绘制文本 时,如果 背景是透明的 —— 则会出现 锯齿. //其实,我不用这三个 属性 好多年了 //而且,这三个属性 在关键时刻还有可能 帮倒忙 //关键是:这三个属性,鸟用都没有 ...

  7. SVG.js 文本绘制整理

    1.SVG.Text var draw = SVG('svg1').size(300, 300); //画文字内容展示 //var text = draw.text('中文内容测试\n换行处理'); ...

  8. Duilib 控件类html富文本绘制

    转载:http://blog.csdn.net/wyansai/article/details/51088896 转载:http://blog.csdn.net/lixiang987654321/ar ...

  9. 用DirectX 11绘制一个Cube

    之前一篇文章讲了如何初始化DirectX 11,现在在此基础上绘制一个Cube,总体可概括为以下几个步骤: 定义Cube顶点数据结构 创建Vertex Buffer和Index Buffer 编写应用 ...

随机推荐

  1. 148. Sort List -- 时间复杂度O(n log n)

    Sort a linked list in O(n log n) time using constant space complexity. 归并排序 struct ListNode { int va ...

  2. jquery表单验证使用插件formValidator

    JQuery表单验证使用插件formValidator 作者: 字体:[增加 减小] 类型:转载 时间:2012-11-10我要评论 jquery表单验证使用插件formValidator,可供有需求 ...

  3. linux如何修改主机名

    一:#hostname hn1 二:修改/etc/sysconfig/network中的 HOSTNAME=hn1三:修改/etc/hosts文件  127.0.0.1 hn1

  4. visio画UML用例图没有include关系的解决方法

    今天用Microsoft Visio画用例图时,发现visio UML用例里面找不到include关系,即“箭头”+“<>” 这个组件,后来终于发现一个可行的解决办法: 首先:打开Micr ...

  5. Hibernate的generator属性之意义

    Hibernate的generator属性之意义 本文讲述Hibernate的generator属性的意义.Generator属性有7种class,本文简略描述了这7种class的意义和用法. Hib ...

  6. 使用ContentResolver添加数据、查询数据

    import java.util.ArrayList;import java.util.HashMap;import java.util.Map; import android.os.Bundle;i ...

  7. 浏览器渲染原理--reflow

    Web页面运行在各种各样的浏览器当中,浏览器载入.渲染页面的速度直接影响着用户体验简单地说,页面渲染就是浏览器将html代码根据CSS定义的规则显示在浏览器窗口中的这个过程.先来大致了解一下浏览器都是 ...

  8. 判断comboBox是否选对了绑定的数据库中的项

    实现: comboBox1下拉列表已绑定数据库,将选中的项保存到数据库时,判断是否已选中下拉列表里的项 如果没选中,或者输入了其他的值,和已绑定的数据不匹配,出现提示框 按钮的点击事件中: strin ...

  9. Python中的sorted函数以及operator.itemgetter函数 【转载】

    operator.itemgetter函数operator模块提供的itemgetter函数用于获取对象的哪些维的数据,参数为一些序号(即需要获取的数据在对象中的序号),下面看例子. a = [1,2 ...

  10. 常用控件产品官方文档/手册/API列表 c#控件文档API列表 asp.net控件产品技术文档中文版

    .netCHARTING报表图表控件 文档帮助手册Ab3d.PowerToys 文档帮助手册Ab3d.Reader3ds 文档帮助手册ABViewer 文档帮助手册 (工程图纸文档管理系统)Activ ...