Frage zu wchar_t



  • Hallo, ich bin neu hier und habe auch gleich eine Frage.

    Ich befasse mich zurzeit mit DirectX und bei der Ausgabe eines Schriftzuges bin ich auf ein Problem gestoßen. Ich muss eine Schriftart zuweisen und das mit D3DXFONT_DESC. Meine font Instanz möchte gerne bei FaceName ein Font Name genannt bekommen. In meinem DirectX Buch steht folgender Weg.

    LOGFONT LogFont = {0};
    strcpy(LogFont.lfFaceName,"Arial"); //hier meldet mit der Compiler einen Fehler hier möchte er ein wchar haben.
    

    es wäre ja zu leicht gewesen, wenn das funktioniert hätte. In den Forum FAQ fand ich folgenden Weg.

    Programmiert habe ich das ganze mit Visual Studio .Net 2005, es handelt sich dabei um eine Win32 Anwendung in C++.

    ...
    void CreateD3DFont(void)
    {
    	// Struktur für das Font festlegen
    	D3DXFONT_DESC font = {0}; //ich nutze kein LOGFONT, weil D3DXCreateFontIndirect eine Instanz von D3DXFONT_DESC haben will
    
    	char *fontname = "Arial"; 
    	wchar_t *Widen; 
    	_USE(cout.getloc(), ctype<wchar_t> ).widen(fontname, fontname+5, Widen); //der Weg aus den Forum FAQ
    
    	wcscpy(font.FaceName,Widen);
    
    	D3DXCreateFontIndirect(lpD3DDevice,&font,&lpD3DFont);
    }
    

    Super, der Compiler ist zufrieden und führt mein DirectX Programm aus. Allerdings gibt er mir die Warnung aus, dass mein Gebilde veraltet ist und nicht Safe ist.

    Folgendes gibt er mir da aus

    Main.cpp
    f:\programmieren\c++\directx\erstes directx win\main.cpp(222) : warning C4996: 'std::ctype<wchar_t>::widen' wurde als veraltet deklariert
    f:\progs\vs2005\vc\include\xlocale(1936): Siehe Deklaration von 'std::ctype<wchar_t>::widen'
    Meldung: "You have used a std:: construct that is not safe. See documentation on how to use the Safe Standard C++ Library"
    f:\programmieren\c++\directx\erstes directx win\main.cpp(225) : warning C4996: 'wcscpy' wurde als veraltet deklariert
    f:\progs\vs2005\vc\include\string.h(250): Siehe Deklaration von 'wcscpy'
    Meldung: "This function or variable may be unsafe. Consider using wcscpy_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details."
    f:\programmieren\c++\directx\erstes directx win\main.cpp(222) : warning C4700: Die nicht initialisierte lokale Variable "Widen" wurde verwendet.

    Ist jetzt nur die Frage wie ich es richtig löse? Ein Kollege meinte ich sollte nur mit string arbeiten, aber dann bekomme ich wieder Probleme bei der Zuweisung des Strings, der meine zu verwendende Schrift angibt. Denn hier wird ein WCHAR verlangt.

    nich leichter geht es so, löst aber nicht das Problem mit der Kompiler Warung.

    wchar_t *Widen = L"Arial";
    wcscpy(font.FaceName,Widen);
    

    Ich hoffe jemand kann mir das erklären.

    Grüße und Dank im Voraus

    FireballGFX



  • Die beiden C4996-Warnungen kannst du umgehen, indem du auf "sichere" Versionen der angegebenen Funktionen ausweichst (in der MSDN müsste stehen, welche das sind) - oder ausschalten, indem du _CRT_SECURE_NO_DEPRECATE in die Compileroptionen als vordefiniertes MAkro einträgt.

    Die C4700-Warnung ist das größere Problem - wcscpy() erwartet von dir, daß du einen entsprechend großen Speicherplatz bereitstellst, wo es die Daten hinkopieren kann. Den mußt du z.B. per new anfordern (oder die Variable als wchar_t-Array definieren).


Log in to reply