JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=978547af97207c632e46dfabc0b7e0bcMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

D3DXFONT_DESC und setzen von FaceName

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
pati`
Mini JLI'ler


Alter: 39
Anmeldedatum: 02.03.2008
Beiträge: 3

Medaillen: Keine

BeitragVerfasst am: 02.03.2008, 16:12    Titel: D3DXFONT_DESC und setzen von FaceName Antworten mit Zitat

Hallo,

ich suche nun bereits drei Stunden nach einer Lösung für folgendes Problem. Ich wollte das Beispiel mit der Textausgabe nachvollziehen.


Code:

void CreateD3DFont(void)
{
   D3DXFONT_DESC Font = {0};

   strcpy_s(Font.FaceName, "Arial");
   
   D3DXCreateFontIndirect(lpD3DDevice, &Font, &lpD3DFont);
}


Ich hatte zunächt LOGFONT als Typ verwendet, nach einigen Recherchen im Internet habe ich herausgefunden, das nach einem SDK-Update der Typ nun D3DXFONT sein muss.

Das Problem dabei ist, wenn ich nun versuche die Schriftart zu setzen, bekomme ich immer wieder ein Fehler das das Typcasting nicht stattfinden kann. Deshalb habe ich mir die Hilfe vom SDK zu der Funktion "D3DXCreateFontIndirect" und dem Typ "D3DXFONT_DESC" angeschaut.

Dort erfährt man das abhängig davon ob der Compiler UNICODE benutzt oder nicht entweder "D3DXFONT_DESCW" oder "D3DXFONT_DESCA" zum auflösen benutzt wird.

Ich verwende Microsoft Viusal C++ 2008 Express Edition und den DirectX SDK Nov.2007. Mein Compiler nutzt UNICODE und verwendet demzufolge "D3DXFONT_DESCW".

Wenn ich

Code:

void CreateD3DFont(void)
{
   D3DXFONT_DESCA Font = {0};

   strcpy_s(Font.FaceName, "Arial");
   
   D3DXCreateFontIndirect(lpD3DDevice, &Font, &lpD3DFont);
}


verwende dann kann zwar das strcpy_s verarbeitet werden, aber die Funktion "D3DXCreateFontIndirect" verlangt als 2. Parameter den Typ "D3DXFONT_DESCW". Egal wie ich es drehe, entweder strcpy funktioniert oder halt " D3DXCreateFontIndirect".

Ich würde mich freuen wenn Jemand eine Lösung parat hat, da ich einfach nicht mehr nachvollziehen kann, wie mit UNICODE die Schriftart korrekt zugewiesen wird. Die bereits in diesem Forum notierten Lösungen funktionieren nicht, habe ich alle ausprobiert.

Vielen Dank im Vorraus,
pati`
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
pati`
Mini JLI'ler


Alter: 39
Anmeldedatum: 02.03.2008
Beiträge: 3

Medaillen: Keine

BeitragVerfasst am: 02.03.2008, 16:37    Titel: Antworten mit Zitat

Ja manchmal sieht man den Wald vor lauter Bäumen nicht Smile ...

habs gefunden ...

Code:

void CreateD3DFont(void)
{
   D3DXFONT_DESCA Font = { 0 };

   strcpy_s(Font.FaceName, "Arial");
   
   D3DXCreateFontIndirectA(lpD3DDevice, &Font, &lpD3DFont);
}


Hab vergessen das wenn ich "D3DXFONT_DESCA" als Typ nutze ja auch explizit die richtige Funktion ("D3DXCreateFontIndirectA") dazu verwenden kann.

Das erklärt aber immer noch nicht warum es nicht mit "D3DXFONT_DESCW" als Typ geht. Naja wer es weiß kann es hier ja preisgeben =).
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
PeaceKiller
JLI Master


Alter: 36
Anmeldedatum: 28.11.2002
Beiträge: 970

Medaillen: Keine

BeitragVerfasst am: 02.03.2008, 17:34    Titel: Antworten mit Zitat

Probier mal:
Code:
wcscpy(Font.FaceName, L"Arial");


http://msdn2.microsoft.com/en-us/library/kk6xf663.aspx
_________________
»If the automobile had followed the same development cycle as the computer, a Rolls-Royce would today cost $100, get a million miles per gallon, and explode once a year, killing everyone inside.«
– Robert X. Cringely, InfoWorld magazine
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
pati`
Mini JLI'ler


Alter: 39
Anmeldedatum: 02.03.2008
Beiträge: 3

Medaillen: Keine

BeitragVerfasst am: 03.03.2008, 11:22    Titel: Antworten mit Zitat

Vielen Dank, damit funktioniert es!

Über die Seite bin ich getern auch bereits gestolpert. Doch woher erkennt man das man bei wcscpy() ein "L" vor den 2. Parameter notieren muss?

Bleibt nur noch zu klären wovon es abhängig ist ob mein Compiler UNICODE verwendet und somit "D3DXFONT_DESC" mit "D3DXFONT_DESCW" und "D3DXCreateFontIndirect" mit "D3DXCreateFontIndirectW" auflöst. Das gleiche passiert übrigens auch mit den restlichen Funktionen, z.B. DrawText, etc..

Es wäre praktisch wenn die Funktionen einfach nur "D3DXCreateFontIndirect" oder "DrawText" heißen würden. Ich bin die IDE Optionen und Projekteigenschaften bereits durchgegangen, habe aber zum Thema UNICODE nichts gefunden. Kann mir da evtl. Jemand auf die Sprünge helfen?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
PeaceKiller
JLI Master


Alter: 36
Anmeldedatum: 28.11.2002
Beiträge: 970

Medaillen: Keine

BeitragVerfasst am: 03.03.2008, 12:57    Titel: Antworten mit Zitat

Ab dem Visual Studio 2005 ist UNICODE standardmäßig aktiviert.

Alle Windowsfunktionen nehmen dann statt char, wchar_t an.

Intern wird das darüber gelöst das eine Funktion wie z.B. DrawText ein define ist und dann entweder auf DrawTextA oder DrawTextW verweist (wobei W die mit Unicode ist).

Damit der Compiler weiß, dass eine Zeichenkette aus wchar_ts besteht, schreibt man ein L davor.

Wenn du flexibel bleiben willst, verwendest du also immer die Funktion ohne A oder W. Und du kannst das TCHAR makro verwenden, das dann entweder ein char oder ein wchar_t ist, je nach dem, ob UNICODE definiert ist oder nicht. Für Zeichenketten kannst du dann auch das TEXT makro verwenden, dass dann bei Bedarf ein L davor hängt. Die ganzen Funktionen der C-Runtime gibt es dann auch noch in einer T Art, die dann auch, je nachdem, auf die wchar_t oder die char Variante verweist.

http://blogs.msdn.com/oldnewthing/archive/2004/02/12/71851.aspx
_________________
»If the automobile had followed the same development cycle as the computer, a Rolls-Royce would today cost $100, get a million miles per gallon, and explode once a year, killing everyone inside.«
– Robert X. Cringely, InfoWorld magazine
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum