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

spacegaier

Alter Hase

  • »spacegaier« ist der Autor dieses Themas

Beiträge: 572

Beruf: Student

  • Private Nachricht senden

1

04.01.2007, 14:49

static HDC hdc = GetDC(hwnd); == möglich?

Hallo zusammen,

noch mal eine Frage:

Kann ich hergehen und folgendes machen:

C-/C++-Quelltext

1
static HDC  hdc = GetDC(hwnd);
oder ändert sicher der Wert des Handles für den DeviceContext des Fenster bei jedem Durchlauf der Window-Prozedure und ich würde somit nur beim ersten Durchlauf den richtigen Wert haben?

Wenn die Variante ginge könnte ich ja einmal am Anfang der Window-Prozedur eine statisches HDC deklarieren und es erst am Ende des Programms freigegeben und müsste mich zwischendurch nicht damit rumschlagen (auch wenn es nicht schwer wäre).

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

04.01.2007, 15:34

Probier's doch einfach aus ...

Firefly

Alter Hase

Beiträge: 484

Wohnort: Irgendwoundnirgendwo

  • Private Nachricht senden

3

05.01.2007, 21:07

soweit ich weiß ändert sich der kontext bei jedem schleifendurchgang...

4

06.01.2007, 11:24

Zitat von »"David Scherfgen"«

Probier's doch einfach aus ...


also ich krieg in meinem studiengang gerade beigebracht niemals trial-and-error zu benutzen ;)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

06.01.2007, 11:56

trial-and-error ist die art und weise wie man am besten lernt ;)

spacegaier

Alter Hase

  • »spacegaier« ist der Autor dieses Themas

Beiträge: 572

Beruf: Student

  • Private Nachricht senden

6

07.01.2007, 13:30

Also, ich hab jetzt halt doch mal per Trial-and-Error rausgefunden, dass:

1. sich das HDC bei jedem Aufruf der Schliefe verändert.

2. es aber auch funktioniert, wenn man das HDC static macht, siehe folgender 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
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    static HDC hdc = GetDC(hwnd);
    RECT clientrect;
    GetClientRect(hwnd, &clientrect);
    // Nachrichten switchen

    //-------------------

    switch(message)
    {
    case WM_CHAR:
        {
            TextOut(hdc, 100, 100, L"Hallo Hier Text!",100);
            Sleep(500);
            FillRect(hdc, &clientrect, CreateSolidBrush(RGB(0,255,255)));
            Sleep(100);
            FillRect(hdc, &clientrect, CreateSolidBrush(RGB(255,255,255)));
        }break;
    case WM_DESTROY:
        {
            // Anfrage zum Beenden senden

            //---------------------------

            PostQuitMessage(0);
            return 0;
        }
    }
    // Den Rest der Standardwindowprozedur überlassen

    //-----------------------------------------------

    return DefWindowProc(hwnd, message, wParam, lParam);
}


Ich werde jetzt ein Mittelding nehmen: Ich lasse am Anfang jedes Durchlaufs der Fenster-Prozedur das HDC feststellen und nutze es für die ganze Schleife. So kann es sich bei jedem Durchlauf ändern (vielleicht ist es ja wichtig) und ich muss dennoch nicht vor jeder Zeichenoperation mir eine HDC holen. Oder spricht etwas gegen diesesn Ansatz?

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

7

07.01.2007, 13:45

Frage: von welcher Schleife redest du?

spacegaier

Alter Hase

  • »spacegaier« ist der Autor dieses Themas

Beiträge: 572

Beruf: Student

  • Private Nachricht senden

8

07.01.2007, 13:52

Ähhh....ich meine Funktion (Windows-Prozedur).

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

9

07.01.2007, 14:51

Und die Windowsprozedur hat ja im wesentlichen ein paar Variablen und dann den switch-case-teil^^
Pro Durchlauf kommst du ja zu genau einem case-block. Wenn du also am Anfang der Funktion dein HDC holst kommst du dannach entweder zu einem case-Block, der das HDC benötigt oder zu einem der es nicht benötigt. Normalerweise aber nie zu 2 Blocken in einem Durchlauf, die es beide benötigen. Es ist also mMn. schon besser, das HDC nur da zu holen, wo es auch gebraucht wird. Oder meintest du was grundlegend anderes:

Zitat

ich muss dennoch nicht vor jeder Zeichenoperation mir eine HDC holen.

spacegaier

Alter Hase

  • »spacegaier« ist der Autor dieses Themas

Beiträge: 572

Beruf: Student

  • Private Nachricht senden

10

07.01.2007, 15:56

Das strimmt auch wieder -> hast mich überzeugt. Mein Ansatz ist nicht gerade sinnvoll -> wird geändert -> Frage geklärt.

Werbeanzeige