none
DirectX DrawText zeigt keine Schrift an. RRS feed

  • Allgemeine Diskussion

  • Hallo,

    Ich habe vor kurzer zeit angefangen mich in die Windowsprogrammierung und Directx9 einzuarbeiten, bin also noch ein ziemlicher Neuling was das angeht.(habe vorher noch nie etwas mit Directx gemacht) Mein Problem ist, dass die Directx Funktion DrawText im Fenster keinen Text ausgibt. Veruche jetzt schon ziemlich lange den fehler zu beheben aber komme einfach zu keine Lösung, und mir gehen so langsam die Ideen aus.

    Weiss jemand woran das liegen kann? oder ist im Code soweit alles richtig?

    Hier mein Code:

    main.cpp:

    //Include's
    #include"winwindow.hpp"
    #include<time.h>
    #include<iostream>
    //main
    int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
    	c_winwindow window(hInstance,nCmdShow);
    	bool b_init=false;
    	b_init=window.init(); 
    	while(b_init){
    		window.clear(D3DCOLOR_XRGB(0xEF,0xEF,0xEF));
    		window.drawtext(0,0,L"Halo",D3DCOLOR_COLORVALUE(0xFF,0,0,0xFF));
    		window.display();
    		b_init=window.update();
    	}
    	return 0; 
    }

    winwindow.hpp:

    //Include's
    #include"windows.h"
    #include"d3d9.h"
    #include"d3dx9.h"
    //c_winwindow
    class c_winwindow{
    	private:
    		HWND hwnd;
    		MSG msg;
    		HINSTANCE hInstance;
    		int nCmdShow;
    		bool b_init;
    		static LRESULT CALLBACK Messagehandler(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam);
    		LPDIRECT3D9 lpd3d;
    		LPDIRECT3DDEVICE9 lpd3ddevice;
    		ID3DXFont *p_d3dfont;
    		bool initwin();
    		bool initdx();
    	public:
    		c_winwindow(const HINSTANCE &hInstance,int nCmdShow);
    		~c_winwindow();
    		bool init();
    		bool update();
    		void clear(D3DCOLOR clr);
    		void display();
    		void drawtext(unsigned short int,unsigned short int,LPCWSTR,D3DCOLOR);
    };

    winwindow.cpp:

    //Include's
    #include"winwindow.hpp"
    #include<iostream>
    //c_winwindow memberfunction's
    //konstruktor
    c_winwindow::c_winwindow(const HINSTANCE &temphInstance,int tempnCmdShow){
    	hInstance=temphInstance;
    	nCmdShow=tempnCmdShow;
    	hwnd=NULL;
    	lpd3d=NULL;
    	lpd3ddevice=NULL;
    	b_init=false;
    }
    //destruktor
    c_winwindow::~c_winwindow(){
    	PostQuitMessage(0);
    	hwnd=NULL;
    	if(lpd3d!=NULL){
    		lpd3d->Release();
    		lpd3d=NULL;
    	}
    	if(lpd3ddevice!=NULL){
    		lpd3ddevice->Release();
    		lpd3ddevice=NULL;
    	}
    	if(p_d3dfont!=NULL){
    		p_d3dfont->Release();
    		p_d3dfont=NULL;
    	}
    }
    //initwin
    bool c_winwindow::initwin(){
    	if(!b_init){
    		WNDCLASS wc;
    		ZeroMemory(&wc,sizeof(wc));
    		wc.lpfnWndProc=Messagehandler;
    		wc.hInstance=hInstance;
    		wc.lpszClassName=L"wndc";
    		RegisterClass(&wc);
    		hwnd=CreateWindow(L"wndc",L"TestWindow",WS_SYSMENU,10,10,1200,800,NULL,NULL,hInstance,NULL);
    		if(hwnd==NULL){
    			return false;
    		}else{
    			b_init=true;
    			ShowWindow(hwnd,nCmdShow);
    			return true;
    		}
    	}else{
    		return true;
    	}
    }
    //initdx
    bool c_winwindow::initdx(){
    	lpd3d=Direct3DCreate9(D3D_SDK_VERSION);
    	if(lpd3d==NULL){
    		return false;
    	}
    	D3DPRESENT_PARAMETERS params;
    	ZeroMemory(&params,sizeof(params));
    	params.SwapEffect=D3DSWAPEFFECT_FLIP;
    	params.hDeviceWindow=hwnd;
    	params.Windowed=true;
    	params.BackBufferWidth=1200;
    	params.BackBufferHeight=800;
    	params.BackBufferFormat= D3DFMT_A8R8G8B8;
    	if(FAILED(lpd3d->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hwnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&params,&lpd3ddevice))){
    		return false;
    	}
    	if(D3D_OK!=D3DXCreateFont(lpd3ddevice,22,0,FW_NORMAL,1,false,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,ANTIALIASED_QUALITY,DEFAULT_PITCH|FF_DONTCARE,L"Arial",&p_d3dfont)){
    		return false;
    	}
    	return true;
    } 
    //init
    bool c_winwindow::init(){
    	return initwin()&&initdx();
    }
    //update
    bool c_winwindow::update(){
    	if(b_init){
    		if(GetMessage(&msg,NULL,0,0)){
    			TranslateMessage(&msg);
    			DispatchMessage(&msg);
    			return true;
    		}else{
    			if(lpd3d!=NULL){
    				lpd3d->Release();
    				lpd3d=NULL;
    			}
    			if(lpd3ddevice!=NULL){
    				lpd3ddevice->Release();
    				lpd3ddevice=NULL;
    			}
    			hwnd=NULL;
    			b_init=false;
    			return false;
    		}
    	}else{
    		return false;
    	}
    }
    //clear
    void c_winwindow::clear(D3DCOLOR clr){
    	lpd3ddevice->Clear(0,0,D3DCLEAR_TARGET,clr,0,0);
    	lpd3ddevice->BeginScene();
    }
    //display
    void c_winwindow::display(){
    	lpd3ddevice->EndScene();
    	lpd3ddevice->Present(0,0,0,0);
    }
    void c_winwindow::drawtext(unsigned short int us_x,unsigned short int us_y,LPCWSTR text,D3DCOLOR textcolor){
    	RECT r;
    	SetRect(&r,us_x,us_y,0,0);
    	p_d3dfont->DrawText(NULL,text,-1,&r,DT_LEFT,textcolor);
    }
    //WndProc
    LRESULT CALLBACK c_winwindow::Messagehandler(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam){
    	switch(msg){
    		case(WM_DESTROY):
    			PostQuitMessage(0); 
    			return 0;
    		break;
    		case(WM_PAINT):
    			return 0;
    		break;
    	}
    	return DefWindowProc(hwnd,msg,wParam,lParam);
    }
    Danke schonmal :)


    • Bearbeitet Mavca Sonntag, 1. März 2015 06:56
    • Typ geändert Aleksander Chalabashiev Montag, 23. März 2015 10:14 keine bestätigte Lösung
    Samstag, 28. Februar 2015 15:09

Alle Antworten

  • keiner ne idee?
    Sonntag, 1. März 2015 09:31
  • Hallo Mavca,

    Du rufst hier in der drawtext-Methode die Funktion SetRect auf, die als viertes und fünftes Parameter die Koordinaten der unteren rechten Ecke des Vierecks erwartet. Würdest Du versuchen, die Funktion SetRect in der Definition der Methode drawtext anstatt mit 0 und 0 mit Werten aufzurufen, die größer sind als us_x, us_y? Gibt es dabei eine Änderung?

    Gruß,
    Dimitar


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Dienstag, 3. März 2015 09:51
    Administrator
  • Hallo Mavca,

    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    Dieser Thread wurde mangels weiterer Beteiligung des Fragestellenden ohne bestätigte Lösung abgeschlossen.
    Neue Rückfragen oder Ergänzungen zu diesem Thread bleiben weiterhin möglich.
    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

    Gruß

    Aleksander


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht,  kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.


    Montag, 23. März 2015 10:15