| 关于作者 |
|
作 者:梁 志 斌
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); //调用缺省消息处理过程 } | |
|