Sign in to follow this  
PlagueX

[Help] Drawing directx 9 text on window

Recommended Posts

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 interface
LPDIRECT3DDEVICE9 d3ddev; // the pointer to the device class
ID3DXFont * Font[13];

// function prototypes
void initD3D(HWND hWnd); // sets up and initializes Direct3D
void render_frame(void); // renders a single frame
void cleanD3D(void); // closes Direct3D and releases memory

// the WindowProc function prototype
LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);


// the entry point for any Windows program
int 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 program
LRESULT 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 use
void 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 frame
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

// 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 COM
void 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]

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites
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);
}

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this