[Help] Drawing directx 9 text on window

Started by
3 comments, last by yewbie 13 years, 4 months ago
Hello, i know c++ but i am fairly new to and not experienced in using directx. I am currently trying to make a main menu for a single player rpg (which i have not even started yet). It will work by loading a win32 window by 600x800 and will directx text for the: "Welcome to this game" or whatever it will be called but i do not know how to do is get my text working. One thing i do know (at least i think is right) is that I will be drawing the text in begin scene or end scene (can't remember which one) but the problem I am having is setting up my text. for example u have to use D3DXCreateFont (which as u know sets up the font) before u can draw your text. here is my code:

main.cpp:
#include <windows.h>#include <string>#include <d3d9.h>#include <d3dx9.h>#include <tchar.h>#include <iostream>#include <d3dx9math.h>#include <detours.h>#include "Colors.h"#include "DrawMyText.h"// include the Direct3D Library file#pragma comment (lib, "d3d9.lib")LPDIRECT3D9 d3d;    // the pointer to our Direct3D interfaceLPDIRECT3DDEVICE9 d3ddev;    // the pointer to the device classID3DXFont * Font[13];// function prototypesvoid initD3D(HWND hWnd);    // sets up and initializes Direct3Dvoid render_frame(void);    // renders a single framevoid cleanD3D(void);    // closes Direct3D and releases memory// the WindowProc function prototypeLRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);// the entry point for any Windows programint WINAPI WinMain(HINSTANCE hInstance,                   HINSTANCE hPrevInstance,                   LPSTR lpCmdLine,                   int nCmdShow){    HWND hWnd;    WNDCLASSEX wc;    ZeroMemory(&wc, sizeof(WNDCLASSEX));    wc.cbSize = sizeof(WNDCLASSEX);    wc.style = CS_HREDRAW | CS_VREDRAW;    wc.lpfnWndProc = WindowProc;    wc.hInstance = hInstance;    wc.hCursor = LoadCursor(NULL, IDC_ARROW);    wc.hbrBackground = (HBRUSH)COLOR_WINDOW;    wc.lpszClassName = "WindowClass";    RegisterClassEx(&wc);    hWnd = CreateWindowEx(NULL,                          "WindowClass",                          "game client",                          WS_OVERLAPPEDWINDOW,                          0, 0,                          800, 600,                          NULL,                          NULL,                          hInstance,                          NULL);    ShowWindow(hWnd, nCmdShow);    // set up and initialize Direct3D    initD3D(hWnd);    // enter the main loop:    MSG msg;    while(TRUE)    {        while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))        {            TranslateMessage(&msg);            DispatchMessage(&msg);        }        if(msg.message == WM_QUIT)            break;        render_frame();    }    // clean up DirectX and COM    cleanD3D();    return msg.wParam;}// this is the main message handler for the programLRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){    switch(message)    {        case WM_DESTROY:            {                PostQuitMessage(0);                return 0;            } break;    }    return DefWindowProc (hWnd, message, wParam, lParam);}// this function initializes and prepares Direct3D for usevoid initD3D(HWND hWnd){    d3d = Direct3DCreate9(D3D_SDK_VERSION);    // create the Direct3D interface    D3DPRESENT_PARAMETERS d3dpp;    // create a struct to hold various device information    ZeroMemory(&d3dpp, sizeof(d3dpp));    // clear out the struct for use    d3dpp.Windowed = TRUE;    // program windowed, not fullscreen    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;    // discard old frames    d3dpp.hDeviceWindow = hWnd;    // set the window to be used by Direct3D    // create a device class using this information and the info from the d3dpp stuct    d3d->CreateDevice(D3DADAPTER_DEFAULT,                      D3DDEVTYPE_HAL,                      hWnd,                      D3DCREATE_SOFTWARE_VERTEXPROCESSING,                      &d3dpp,                      &d3ddev);}// this is the function used to render a single framevoid render_frame(void){    // clear the window to be black    d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, dBlack, 1.0f, 0);    d3ddev->BeginScene();    // begins the 3D scene    // do 3D rendering on the back buffer here    d3ddev->EndScene();    // ends the 3D scene    d3ddev->Present(NULL, NULL, NULL, NULL);   // displays the created frame on the screen}// this is the function that cleans up Direct3D and COMvoid cleanD3D(void){    d3ddev->Release();    // close and release the 3D device    d3d->Release();    // close and release Direct3D}



DrawMyText.h:
#include <windows.h>#include <string>#include <d3d9.h>#include <d3dx9.h>#include <tchar.h>#include <iostream>#include <d3dx9math.h>#include <detours.h>void DrawMyText(char pString[], int x, int y, D3DCOLOR col, ID3DXFont *font)    {																			    	RECT FontRect = { x, y, x+500, y+50 };									   	font->DrawText( NULL, pString, -1, &FontRect, DT_LEFT | DT_WORDBREAK, col);	}





if anyone can tell me were and how i would set up my text using D3DXCreateFont or correct me if i am doing everything completely wrong, and help would be great.

[Edited by - PlagueX on December 6, 2010 1:07:52 PM]
Advertisement
First, take a look at the faq (upper right-hand corner) and please use [code][/code] or [source][/source] tags to post that much code.

You can click EDIT for my post to see how code tags are setup.This is what code looks like inside those tags.

And source tags also.

Second, you don't check for any errors in your code. Every DirectX function gives some indication of success or failure. Take a look at some of the examples in the SDK.

While you're working through some of the examples in the SDK, search for D3DXCreateFont to see how to create your font. While you're looking at that, (as mentioned above) note that errors are checked for in nearly every DirectX function call. Also, note that the font is normally created after the device is created.

You also don't check for the device status anywhere. If you resize the window or switch between windows while your program is running, you'll probably run into problems. Again, the SDK examples will give you guidance on how to set that error-checking up.

Once you've gone through all that [smile], remember:

1. call font->OnLostDevice() and font->OnResetDevice() appropriately

2. release the font when you're done with it (probably on exit) or you'll get memory leaks.

EDIT: By the way, you can go back to your initial post, click edit and add code or source tags.

Please don't PM me with questions. Post them in the forums for everyone's benefit, and I can embarrass myself publicly.

You don't forget how to play when you grow old; you grow old when you forget how to play.

Quote:Original post by Buckeye
First, take a look at the faq (upper right-hand corner) and please use [code][/code] or [source][/source] tags to post that much code.

You can click EDIT for my post to see how code tags are setup.This is what code looks like inside those tags.

*** Source Snippet Removed ***
Second, you don't check for any errors in your code. Every DirectX function gives some indication of success or failure. Take a look at some of the examples in the SDK.

While you're working through some of the examples in the SDK, search for D3DXCreateFont to see how to create your font. While you're looking at that, (as mentioned above) note that errors are checked for in nearly every DirectX function call. Also, note that the font is normally created after the device is created.

You also don't check for the device status anywhere. If you resize the window or switch between windows while your program is running, you'll probably run into problems. Again, the SDK examples will give you guidance on how to set that error-checking up.

Once you've gone through all that [smile], remember:

1. call font->OnLostDevice() and font->OnResetDevice() appropriately

2. release the font when you're done with it (probably on exit) or you'll get memory leaks.

EDIT: By the way, you can go back to your initial post, click edit and add code or source tags.


i tried the code tags in my original post but for some reason they dont do anything, but source tags work. and thanks for the reply btw. i didnt ever look in the sdk for examples... that will help me alot, and it answers my question i made this thread abt in there.
The code tags are very similar to the source tags. Click edit for this post. The following is inside code tags.
void DrawMyText(char pString[], int x, int y, D3DCOLOR col, ID3DXFont *font)    {																			    	RECT FontRect = { x, y, x+500, y+50 };									   	font->DrawText( NULL, pString, -1, &FontRect, DT_LEFT | DT_WORDBREAK, col);	}

Please don't PM me with questions. Post them in the forums for everyone's benefit, and I can embarrass myself publicly.

You don't forget how to play when you grow old; you grow old when you forget how to play.

First thing I notice is why are you creating 13 fonts?

ID3DXFont * Font[13];

Also in the code you posted you never actually call your drawtext function

You should render your text here
void render_frame(void){    // clear the window to be black    d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, dBlack, 1.0f, 0);    d3ddev->BeginScene();    // begins the 3D scene    // RENDER TEXT HERE    d3ddev->EndScene();    // ends the 3D scene    d3ddev->Present(NULL, NULL, NULL, NULL);   // displays the created frame on the screen}


In your initD3D after you have created your device you would want to use D3DXCreateFont to create your font.

Then between your begin scene and end scene you would draw with your font.

This thread has a really good class someone made to use d3dsprite with the font, it works well.


http://www.gamedev.net/community/forums/topic.asp?topic_id=213012

This topic is closed to new replies.

Advertisement