Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

flux

Treue Seele

  • »flux« ist der Autor dieses Themas
  • Private Nachricht senden

1

04.07.2006, 17:34

Textausgabe in Direct3D

Hi.
Hab mich mal daran versucht einen Text unter Direct3D auszugeben. Dabei wollte ich nicht die D3DX.. Sachen benutzen udn hab es deshalb mit der GDI versucht. Das hat auch geklappt. Ich hab den device-context vom Fenster geholt und dann darauf gezeichnet.
Da kam das Problem auf, dass es flackerte auch wenn nur der Text ausgegeben wurde und sonst nichts gemacht wurde.
Dann hab ich versucht den DC vom Backbuffer zu bekommen und da ist mein Problem. Den DC bekomme ich nämlich nicht. Ich weiss aber auch nicht, ob das dann besser läuft oder nicht, aber ich wollte es mal ausprobieren, weil wenn ich dann vom Backbuffer/Frontbuffer einen Screenshot machen würde, müsste doch eigentlich der Text nicht dabei sein. Das will ich ja auch net.

Also hier mal mein Code:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
void font::load(std::basic_string<wchar_t> name, unsigned int height, unsigned int width, int angle, unsigned int weight, font_attribute attributes)
    {
        DEBUG;
        HDC__* hDC = NULL;
        
        //hDC = GetDC(window::getInstance().getHwnd());

        /////////////////

        IDirect3DSurface9 *backbuffer = NULL;
            
        if(direct3d::getInstance().getDevice()->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &backbuffer) != D3D_OK)
        {
            EX(L"Failed to get backbuffer!");
        }
        backbuffer->GetDC(&hDC);


        ////////////////

        if(hDC == NULL)
        {
            EX(L"Failed to get device context!");  // DIESE EXCEPTION KOMMT

        }

        if(!SetGraphicsMode(hDC, GM_ADVANCED))
        {
            EX(L"Failed to set the graphics-mode!");
        }

        font_ = CreateFontW(
            -MulDiv(height, GetDeviceCaps(hDC, LOGPIXELSY), 72),
            width,
            angle,
            angle,
            weight,
            attributes & italic,
            attributes & underline,
            attributes & strikeout,
            DEFAULT_CHARSET,
            OUT_DEFAULT_PRECIS | OUT_DEVICE_PRECIS,
            CLIP_EMBEDDED,
            ANTIALIASED_QUALITY,
            FF_DONTCARE,
            name.c_str());
        if(font_ == NULL)
        {
            EX(L"Failed to load font!");
        }
        
        if(!ReleaseDC(NULL, hDC))
        {
            EX(L"Failed to release device context!");
        }
    }

    void font::draw(std::basic_string<wchar_t> text, int x, int y, unsigned long color)
    {
        tagRECT rect = {x, y, 0, 0};
        HDC__* hDC = NULL;
        
        //hDC = GetDC(window::getInstance().getHwnd());

        IDirect3DSurface9 *backbuffer = NULL;
            
        if(direct3d::getInstance().getDevice()->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &backbuffer) != D3D_OK)
        {
            EX(L"Failed to get backbuffer!");
        }
        backbuffer->GetDC(&hDC);
        if(hDC == NULL)
        {
            EX(L"Failed to get device context!");
        }

        SelectObject(hDC, font_);
        SetTextColor(hDC, color);
        SetBkMode(hDC, TRANSPARENT);

        DrawTextW(hDC, text.c_str(), -1, &rect, DT_CALCRECT);
        DrawTextW(hDC, text.c_str(), -1, &rect, DT_WORDBREAK | DT_NOCLIP);
        if(!ReleaseDC(NULL, hDC))
        {
            EX(L"Failed to release device context!");
        }
    }


Da hoff ich mal, dass ihr mir helfen könnt.

big_muff

Alter Hase

Beiträge: 460

Wohnort: Schweiz

Beruf: Informatikstudent (4. Semester)

  • Private Nachricht senden

2

04.07.2006, 17:50

So wie ich dich verstanden habe, schlägt bei dir die Funktion GetDC() fehl.
Die Ursachen die das haben kann findest du ja in der SDK-Dokumentation.
Ich denke aber das bei dir nur folgende 2 Fehler möglich sind:

Zitat von »"DirectX SDK"«

GetDC fails on render targets unless they were created lockable (or, in the case of back buffers, with the D3DPRESENTFLAG_LOCKABLE_BACKBUFFER flag).

Du musst beim erstellen des Devices bei den PresentParameters das Flag D3DPRESENTFLAG_LOCKABLE_BACKBUFFER setzten!

Zitat von »"DirectX SDK"«

Formats that contain Alpha are not supported because the GDI implementations don't have a well-defined behavior on the alpha channel.

Dein BackBuffer-Format darf keine Alpha-Informationen enthalten!

Ansonsten poste mal deine Direct3D-Initialisierungsfunktion.
Nur Idioten halten Ordnung, ein Genie beherrscht das Chaos.[size=7]

[/size]HardFate - Ein Start, Ein Ziel, Viele Wege[size=7]

[/size]Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.

flux

Treue Seele

  • »flux« ist der Autor dieses Themas
  • Private Nachricht senden

3

04.07.2006, 18:24

Oh sorry, hatte vergessen zu schreiben, dass ich das alles schon gecheckt habe.
Jetzt hab ich den Fehler auch gefunden. Danke!

Zitat

GetDC fails on render targets unless they were created lockable (or, in the case of back buffers, with the D3DPRESENTFLAG_LOCKABLE_BACKBUFFER flag).

Entweder bin ich blöd oder das ist etwas blöd formuliert.
Hatte verstanden, dass es fehlschlägt, wenn die nciht als lockable erstellt wurden oder wenn der backbuffer mit D3DPRESENTFLAG_LOCKABLE_BACKBUFFER erstellt wurde.

Naja, jetzt klappts ja. *freu*

Anonymous

unregistriert

4

04.07.2006, 18:46

flux
Das etwas dumm geratene ist, das Du keinerlei richtige Fehlerkorrektur in dieser Funktion hast um solche Fälle abzuhalten oder zu kompensieren ;) Da solltest Du noch etwas ausbauen, hilft in Zukunft sehr ;)

Vorallem die Sache mit SelectObject und so sieht mir etwas gefährlich aus ;)

flux

Treue Seele

  • »flux« ist der Autor dieses Themas
  • Private Nachricht senden

5

04.07.2006, 19:16

@nix da: Hmm... du meinst die Fehlerkorrektur für die Übergabeparameter oder? So weit war ich noch nicht, ich wollte es erst einmal ausprobieren, ob das so wie ich mir das gedacht habe überhaupt funktioniert. Und hier wusste ich definitiv, dass es am DC liegt, weil ich es vorher schon alles ausprobiert habe und dort auch eine Fehlerabfrage habe. Vlt sollte ich dann nur noch mal testen, ob der Backbuffer auch alle Vorraussetzungen hat für die GetDC() Methode.
Bei dem SelectObject und so war ich auch noch nicht. Habs nur schnell zum Probieren gemacht.

Das Fehlerkorrektur/-abfrage hilfreich ist, hab ich bereits mehrfach schmerzlich feststellen müssen. Da war die Freude über die dort vorher gesparte Zeit/Arbeit schnell verflogen :lol:

Werbeanzeige