梁志斌的专栏

游戏开发 DirectX技术

 
首页>>
关于作者

作  者:梁  志  斌

QQ   :3055720

QQ群:14739153

友情链接
搜索日志
访问计数
最新评论

关于字体的显示(2D) [2005-8-19]
happy201 发表在 DirectX开发
本例只是一个演示,实现了一行字体的显示,如果大家需要显示更多的内容,只需要在BeginScene和EndScene
之间重新构造一个Rect然后调用DrawText就行了。
具体代码如下:

************************************************************************************************
//****************************************************************************
//说明:
//开发环境:Visual C++.NET 7.1.3091 DirectX 9.0C
//操作系统:WindowsXP SP2
//硬件:AMD Athlon XP 2500+,DDR400 256MB,Geforce4 MX440 AGP 8X 64MB
//****************************************************************************
//链接库文件
#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib")
#pragma comment(lib,"dxguid.lib")
//包含文件
#include<d3d9.h>
#include<d3dx9.h>
#include<windows.h>
#include<d3d9types.h>
//函数申明
void Render(void);
void Cleanup(void);
BOOL InitWindow(HINSTANCE hInstance,int nCmdShow);
LRESULT CALLBACK WinProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam);
//变量说明
HWND hWnd;
LPD3DXFONT pfont;
LPDIRECT3D9 D3d9;
LPDIRECT3DDEVICE9 D3dDevice9;
//*******************************************************************
//函数:InitWindow()
//功能:创建窗口
//编写人:梁志斌
//*******************************************************************
static BOOL InitWindow(HINSTANCE hInstance,int nCmdShow)
{
WNDCLASS wndcls;
    wndcls.cbClsExtra=0;                                        //分配给窗口类结构之后的额外字节数
    wndcls.cbWndExtra=0;                                        //分配给窗口实例之后的额外的字节数
    wndcls.hbrBackground=CreateSolidBrush(RGB(58,110,165));        //桌面背景色
    wndcls.hCursor=LoadCursor(NULL,IDC_ARROW);                    //窗口中的鼠标形状
    wndcls.hIcon=LoadIcon(NULL,"CounterStrike.ico");            //窗口图标
    wndcls.hInstance=hInstance;                                    //窗口所对应的应用程序的句柄
    wndcls.lpfnWndProc=(WNDPROC)WinProc;                        //窗口消息处理函数的指针
    wndcls.lpszClassName="CounterStrike";                        //窗口的类名称
    wndcls.lpszMenuName=NULL;                                    //窗口的菜单资源名称
    wndcls.style= NULL;                                            //窗口的风格
    if(!RegisterClass(&wndcls))                                    //注册窗口
    {
        ::MessageBox(0, "RegisterClass() - FAILED", 0, 0);
        return FALSE;
    }

    hWnd=CreateWindow("CounterStrike","CounterStrike",WS_POPUP|WS_MAXIMIZE|WS_MINIMIZE,0,0,
    GetSystemMetrics(SM_CXSCREEN),                                //此函数返回屏幕宽度
GetSystemMetrics(SM_CYSCREEN),                                //此函数返回屏幕高度
    GetDesktopWindow(),NULL,hInstance,NULL);
    if(!hWnd)
    {
        ::MessageBox(0, "CreateWindow() - FAILED", 0, 0);
        return FALSE;
    }

    ShowWindow(hWnd,SW_SHOWNORMAL);
    UpdateWindow(hWnd);
    return TRUE;
}
//**********************************************************************
//函数:InitD3D()
//功能:初始化D3D
//编写人:梁志斌
//**********************************************************************
bool InitD3D()
{    
    if(NULL==(D3d9=Direct3DCreate9(D3D_SDK_VERSION)))
    {
        ::MessageBox(0, "Direct3DCreate9() - FAILED", 0, 0);
        return FALSE;
    }
    //取得当前显示设备的显示模式
D3DDISPLAYMODE d3ddm;
if(D3D_OK!=(D3d9->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&d3ddm)))
    {
        ::MessageBox(0,"GetAdapterDisplayMode() - FAILED",0,0);
        return FALSE;
    }
//设置D3D设备的属性
    D3DPRESENT_PARAMETERS D3dpp;
    ZeroMemory(&D3dpp, sizeof(D3dpp));
    D3dpp.Windowed=false;                                        //全屏
    D3dpp.hDeviceWindow=hWnd;                                    //窗口设备的句柄
    D3dpp.SwapEffect=D3DSWAPEFFECT_FLIP;                        //设置交换模式
    D3dpp.BackBufferCount=1;                                    //有一个后台缓存
    D3dpp.BackBufferWidth=d3ddm.Width;                            //屏幕宽度
    D3dpp.BackBufferHeight=d3ddm.Height;                        //屏幕长度
    D3dpp.PresentationInterval=D3DPRESENT_INTERVAL_IMMEDIATE;    //立即显示刷新后的图像
    D3dpp.BackBufferFormat=D3DFMT_A8R8G8B8;                        //色彩深度
    D3dpp.EnableAutoDepthStencil=true;                            //开启自动深度缓冲
    D3dpp.AutoDepthStencilFormat=D3DFMT_D24S8;                    //24位深度缓冲并保留8位模版缓冲(stencil buffer)
    //创建D3D设备
    if(D3D_OK!=(D3d9->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&D3dpp,&D3dDevice9)))
    {
        ::MessageBox(0, "CreateDevice() - FAILED", 0, 0);
        return FALSE;
    }
    D3dDevice9->SetRenderState( D3DRS_LIGHTING, FALSE );
    HRESULT hr;
    HDC hDC;
    int nHeight;
    int nPointSize = 18;

    hDC = GetDC( NULL );

    nHeight = -( MulDiv( nPointSize, GetDeviceCaps(hDC, LOGPIXELSY), 72 ) );

    ReleaseDC( NULL, hDC );

    // Create a font for statistics and help output
    hr = D3DXCreateFont( D3dDevice9, nHeight, 0, FW_BOLD, 0, FALSE,
         DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, DEFAULT_QUALITY,
         DEFAULT_PITCH | FF_DONTCARE, TEXT("Arial"),
         &pfont );
    if(FAILED(hr))
    {
        MessageBox(0,"D3DXCreatFont() - FAILED",0,0);
        return FALSE;
    }
    return true;
}
void Render(void)
{
    RECT rect;
    SetRect(&rect,10,10,200,50);
    //用桌面背景色清空背景区域
    D3dDevice9->Clear(0,NULL,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(58,110,165),1.0f,0);
    // 开始绘制场景
    if(SUCCEEDED(D3dDevice9->BeginScene()))
    {
        pfont->DrawText(NULL,"梁志斌的DEMO",-1,&rect,DT_LEFT,D3DCOLOR_XRGB(255,0,0));
    }
    // 结束场景绘制
D3dDevice9->EndScene();
    D3dDevice9->Present( NULL, NULL, NULL, NULL );
}
void Cleanup(void)
{
    if(D3dDevice9!=NULL)
D3dDevice9->Release();

if(D3d9!=NULL)
D3d9->Release();

    if(pfont!=NULL)
        pfont->Release();
}
//**********************************************************************
//函数:WinMain()
//功能:Windows 程序入口函数。创建主窗口,处理消息循环
//编写人:梁志斌
//**********************************************************************

int WINAPI WinMain(HINSTANCE hInstance, //hInstance:表示该应用程序的句柄
HINSTANCE hPrevInstance, //hPrevInstance:为了保持与16位windows应用程序的兼容性
LPSTR lpCmdLine, //lpCmdLine:指向命令行参数字符串的指针
int nCmdShow) //nCmdShow:指定应用程序窗口显示方式的整数
{    
    InitWindow(hInstance,nCmdShow);
    InitD3D();
    Render();

MSG msg;
ZeroMemory( &msg, sizeof(msg) );
while(GetMessage(&msg,NULL,0,0))
{
            TranslateMessage( &msg );
            DispatchMessage( &msg );
     }
return (int)msg.wParam;
}

//*******************************************************************
//函数:WinProc()
//功能:处理窗口消息
//编写人:梁志斌
//*******************************************************************

LRESULT CALLBACK WinProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
switch(msg)
{
case WM_KEYDOWN:        //击键消息
switch(wParam)
{
case VK_ESCAPE:
//MessageBox(hWnd,"ESC键按下了,确定退出!","Keyboard",MB_OK);
DestroyWindow(hWnd); //释放窗口
Cleanup();
PostQuitMessage(0); //给窗口发送WM_QUIT消息
return 0;            //处理完一个消息后返回0
}
return 0;
}
return DefWindowProc(hWnd,msg,wParam,lParam); //调用缺省消息处理过程
}
≡≡≡≡≡ 评论(共 条)我要评论
 

 Copyright  @  好想~~~~好想 2005.03