今回は、文字書きます(今更かよー) 今回使うファイルは次のようになってます。どぞー(-ω-)つ旦 zipでほしい人はこちら 文字を書くDirectXTextクラスはwinmain側にまとめてあります #define _CRT_SECURE_NO_WARNINGS #define _CRT_NON_CONFORMING_SWPRINTFS #include <vector> #include <Windows.h> #include <tchar.h> #include "direct3d.h" //////////////////////////////////////////////// // テキスト描画クラス class DirectXText { private: ID3DXFont* pFont; // Direct3Dフォント RECT Rect; // 描画領域 std::vector<TCHAR> Buf; // 文字列バッファ public: // コンストラクタ DirectXText(); // デストラクタ virtual ~DirectXText(); // DirectXフォント作成 bool Create(IDirect3DDevice9* pD3DDevice,int FontHeight = 16); // 文字列の描画 void Draw(DWORD Color,int x,int y,const TCHAR* Str,...); }; // コンストラクタ DirectXText::DirectXText() { pFont = NULL; } // デストラクタ DirectXText::~DirectXText() { if(pFont != NULL) pFont->Release(); } // DirectXフォント作成 bool DirectXText::Create(IDirect3DDevice9* pD3DDevice,int FontHeight) { HFONT hFont = NULL; // フォントハンドル LOGFONT LogFont ={}; // フォント構造体 // デフォルトフォント取得 hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT); // デフォルトフォント情報取得 GetObject( hFont, sizeof(LOGFONT), &LogFont); // DirectXフォント作成 if(FAILED(D3DXCreateFont(pD3DDevice, FontHeight, // 文字高さ LogFont.lfWidth, // 文字幅 LogFont.lfWeight, // フォントの太さ 0, // ミップマップレベル LogFont.lfItalic, // イタリックフラグ LogFont.lfCharSet, // 文字セット LogFont.lfOutPrecision, // 実際のフォントと目的のフォントの特性の一致方法 LogFont.lfQuality, // クォリティ LogFont.lfPitchAndFamily, // ピッチとファミリインデックス LogFont.lfFaceName, // フォント名 &pFont))) { return false; } return true; } // 文字列の描画 void DirectXText::Draw(DWORD Color,int x,int y,const TCHAR* Str,...) { va_list args; va_start( args, Str ); // 可変引数の最初の要素を格納する int len = _vsctprintf( Str, args ) + 1; // 文字数カウント、ヌル文字分加える if(Buf.size() < (UINT)len) Buf.resize(len); // 文字サイズ分動的にメモリ確保 _vstprintf( &Buf[0], Str, args ); // 文字を整形する SetRect( &Rect, 0,0,0,0 ); // 描画領域サイズ取得 pFont->DrawText(NULL, &Buf[0], -1, &Rect, DT_LEFT | DT_CALCRECT, Color); // 本描画 Rect.left += x; Rect.right += x; Rect.top += y; Rect.bottom += y; pFont->DrawText(NULL, &Buf[0], -1, &Rect, DT_LEFT, Color); } //////////////////////////////////////////////// // ウィンドウプロシージャ、ウィンドウに対するメッセージ処理を行う LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam){ switch(msg){ // ウィンドウが破棄されたとき case WM_DESTROY: PostQuitMessage(0); // WM_QUITメッセージをメッセージキューに送る return 0; } // デフォルトのメッセージ処理を行う return DefWindowProc(hWnd, msg, wParam, lParam); } // WinMain関数(アプリケーションの開始関数) // コンソールアプリケーションと違い、コンソールを開かない int _stdcall WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) { const TCHAR* WC_BASIC = _T("BASIC_WINDOW"); // シンプルウィンドウクラス設定 WNDCLASSEX wcex ={sizeof(WNDCLASSEX), CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS,WndProc, 0,0,hInstance, (HICON)LoadImage(NULL,MAKEINTRESOURCE(IDI_APPLICATION),IMAGE_ICON,0,0,LR_DEFAULTSIZE | LR_SHARED), (HCURSOR)LoadImage(NULL,MAKEINTRESOURCE(IDC_ARROW),IMAGE_CURSOR,0,0,LR_DEFAULTSIZE | LR_SHARED), (HBRUSH)GetStockObject(WHITE_BRUSH), NULL, WC_BASIC , NULL}; // シンプルウィンドウクラス作成 if(!RegisterClassEx(&wcex)) return false; // ウィンドウ幅、高さはディスプレイに依存する。普通は4:3 const int WINDOW_WIDTH = 640; const int WINDOW_HEIGHT = 480; // ウィンドウの作成 HWND hWnd = CreateWindowEx(0,WC_BASIC, _T("Application"), WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_VISIBLE, CW_USEDEFAULT,CW_USEDEFAULT,WINDOW_WIDTH,WINDOW_HEIGHT,NULL,NULL,hInstance,NULL); /////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////// // Direct3Dの初期化 //////////////////////////////////// Direct3D direct3d; direct3d.Create(hWnd,WINDOW_WIDTH,WINDOW_HEIGHT); //////////////////////////////// // フォント作成 //////////////////////////////// DirectXText text; text.Create(direct3d.pDevice3D,32); /////////////////////////////////////////////////////////////////////////////////////////////// // メッセージループ MSG msg = {}; while(msg.message != WM_QUIT) { // アプリケーションに送られてくるメッセージをメッセージキューから取得する if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){ DispatchMessage(&msg); // アプリケーションの各ウィンドウプロシージャにメッセージを転送する } // メッセージ処理をしていないとき else{ //(ここにDirectXの処理を書く) /////////////////////////////////////////////////////////////////////////////////////////////// // 描画開始 if(SUCCEEDED(direct3d.pDevice3D->BeginScene())) { DWORD ClearColor = 0xff808080; // 背景クリア色 // 背景クリア direct3d.pDevice3D->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_STENCIL | D3DCLEAR_ZBUFFER, ClearColor, 1.0f, 0 ); // 文字描画 text.Draw(0xffff0000,0,0,_T("Hello DirectX \n")); // 描画終了 direct3d.pDevice3D->EndScene(); } // 描画反映 direct3d.pDevice3D->Present( NULL, NULL, NULL, NULL ); /////////////////////////////////////////////////////////////////////////////////////////////// } } return 0; }
|