Wie kann ich auf de Desktop zeichnen?



  • Hallo,
    In Winapi kann man zeichnen aber wie kann man auf den Desktop zeichnen
    quasi ohne Fenster ?



  • wenn du den DC mit GetDc(HWND) holst, schreibst du einfach statt HWND NULL rein, und du kannst mie diesem hdc zeichnen



  • case WM_PAINT:
    {
    HDC hDC=GetDC(0);
    PAINTSTRUCT ps;
    hDC=BeginPaint(0"statt hwnd",&ps);
    {
    Rectangle(hDC,0,0,100,100);
    }
    EndPaint(0"statt hwnd",&ps);
    return 0;
    }
    so funktionierst ni er zeigt immer noch en Fenster an



  • lol warum überschreibst du den HDC wieder mit BeginPaint? Entweder du holst dir den HDC mit GetDC oder BeginPaint aber nicht beides. Außerdem musst du den HDC wieder mit ReleaseDC freigeben.
    Und was soll das "statt hwnd" im Code?
    so hat er es gemeint:

    case WM_PAINT:
    {
    HDC hDC=GetDC(0); // HDC sollte nicht unbedingt in WM_PAINT deklariert werden
    Rectangle(hDC,0,0,100,100);
    ReleaseDC(0, hDC);
    return 0;
    }
    


  • Melan schrieb:

    [...] HDC sollte nicht unbedingt in WM_PAINT deklariert werden

    warum?

    cheers, Swordfish



  • weil er dann mit jedem WM_PAINT neu erstellt wird...
    ist zwar kein Fehler aber muss ja nicht sein. Aber das ist wohl Geschmackssache.



  • ich glaub das ist ziemlich egal aber manchma wenn man das in case deklariert kommt initialisierung durch case marke übersprungen darum mache ich es auch lieber auserhlab der cases



  • Erstmal würde ich auf jedenfall in WM_PAINT ein BeginPaint() und EndPaint() verbauen.
    EndPaint() sagt Windows dass du dein Fenster neu gezeichnet hast - Lässt man das weg befeuert Windows das Programm ohne Unterbrechung mit WM_PAINT Nachrichten!
    (Alternativ gäbe es noch ValidateRect())

    Danach kannst du ja immer noch mit GetDC() ReleaseDC() was am Desktop fuschen.
    Ohne Fenster geht das auch, GetDC() etc. lassen sich auch außerhalb von WM_PAINT benutzen.



  • thx 🙂



  • @winkek: Deshalb sind Deklarationen unterhalb von case-Marken auch nicht erlaubt - außer, sie sind in ihrer Gültigkeit durch einen Block beschränkt.

    Melan schrieb:

    weil er dann mit jedem WM_PAINT neu erstellt wird...

    Diese Antwort hab' ich befürchtet. Keineswegs muss der Speicher für hDC jedesmal neu reserviert werden - und die meisten Compiler wissen das auch 😉 Der Call von GetDC( ) muss natürlich so oder so jedesmal erfolgen.

    Mir gefällt Melan's Stil besser, da der Gültigkeitsbereich der Variable mit ihrer Verwendung übereinstimmt.

    “We should forget about small efficiencies, say about 97% of the time. Premature optimization is the root of all evil –- Knuth, Literate Programming, 1992, p28.

    cheers, Swordfish



  • speicher reserviert wird sowiso nicht.
    Es wird jediglich am anfang platz für einen wert mehr auf dem stack bereit behalten.
    ob ich 4 byte oder 400 byte lokal reserviere, macht von der zeit keinen unterschied, da jediglich ein fester wert auf den stackpointer addiert wird.



  • vlad_tepesch schrieb:

    speicher reserviert wird sowiso nicht.

    Entschuldige die Wortwahl - das hDC am Stack liegt, ist mir auch klar... 🙄

    cheers, Swordfish


Anmelden zum Antworten