mit der GDI auf den Desktop zeichnen



  • Hallo,
    ich habe gerade begonnen mit der GDI zu arbeiten und ein paar Figuren zu zeichnen. In Fenstern klappt das auch wunderbar. Es ist mir jedoch noch nicht gelungen damit auf den Desktop zu zeichnen. Bisher habe ich es so versucht:

    #include <windows.h>  // für die GDI+ wird auch windows.h benötigt 
    #include <gdiplus.h>  // dieser Header ist für alle GDI+ Klassen, Funktionen usw. 
    #include<conio.h>
    #pragma comment(lib, "gdiplus.lib")
    
    using namespace Gdiplus; // 01 
    
    HDC hdc=GetDC(GetDesktopWindow());
    
    void paint(HDC hdc) { 
       Graphics graphics(hdc);    // 04 
       Pen      pen(Color(255, 0, 0, 255));   // 05 
       graphics.DrawLine(&pen, 0, 0, 200, 100);   // 06 
    } 
    
    int main() 
    { 
       system("PAUSE");
       GdiplusStartupInput gdiplusStartupInput; 
       ULONG_PTR           gdiplusToken;   
       GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); // 02 
       // ... 
       paint(hdc); 
       // ... 
       GdiplusShutdown(gdiplusToken);  // 03 
       getch();
    }
    

    der code stammt, wenn auch leicht abgeändert, aus diesem Tutorial: http://www.c-plusplus.net/forum/viewtopic-var-t-is-128603.html

    in einem Fenster klappt es ja auch wenn man zB statt GetDesktopWindow() einfach GetConsoleWindow() einsetzt. nur auf dem Desktop nicht 😞 .

    kann man mit der GDI überhaupt auf den Desktop zeichnen? und wenn ja was ist an meinem code denn falsch?

    danke schonmal,
    andi01.



  • Doch prinzipiell geht das.

    Als ich das hier gemacht habe:
    http://www.drakon.ch/?id=2201

    hatte ich IIRC auch Probleme das mit der GDI+ zu machen und habe darum normales GDI benutzt. Da geht das recht gut.



  • hm, ich habe mich bis jetzt eigentlich nur mit der gdiplus beschäftigt^^

    eigentlich will ich ja nur ne kleine Linie auf den Desktop zeichnen, in einem Fenster ist es ja auch nicht so schwer 🙂 .

    hat vielleicht jemand ein kleines funktionierendes Codebeispiel (egalb ob GDI oder GDI+ , letztendlich ist ja nur das Ergebnis wichtig 😉 ) oder ein gutes tutorial für normale GDI?

    mfg,
    andi01.



  • Naja. Schau doch bei dem Link. Da ist ein extrem einfaches Beispiel drin. Und anstatt eine Bitmap zu zeichnen kannst du ja eine Linie zeichnen, wie dus in einem Fenster machen würdest. Das geht mit der GDI wunderbar.

    Habs mir mal nochmal angeschaut. Ist wahrscheinlich sehr viel dabei, was du nicht brauchst. Aber kannst ja mal Schrittweise das entfernen, was du nicht brauchen kannst.



  • ich habe mir das Beispiel jetzt nochmal genauer angeschaut. Soweit ich den Quellcode verstehe(ich habe ja erst gestern abend begonnen mich mit der GDI zu beschäftigen 😃 ) wird dort ebenfalls in ein zuvor erstelltes Fenster gezeichnet. Das funktioniert bei meinem Codeschnipsel ja auch wenn man GetDesktopWindow() durch FindWindow(...) austauscht.

    das was ich tun wollte ist wie mit der Funktion SetPixel() unabhängig von zuvor erstellten Fenstern auf den Bildschirm zu zeichnen, zB direkt auf den desktop. geht das mit der GDI auch?

    mfg,
    andi01.



  • so unterdessen habe ich mein Problem selbst mit der GDI+ gelöst 😃 .

    statt

    HDC hdc=GetDC(GetDesktopWindow());
    

    muss man einfach

    HDC hdc=GetWindowDC(GetDesktopWindow())
    

    schreiben! damit klsppt es.

    allerdings würde ich trotzdem ganz gerne verstehjen warum... wo ist den der Unterschied zwischen GetDC() und GetWindowDC()?

    mfg,
    andi01.



  • andi01 schrieb:

    geht das mit der GDI auch?

    Es geht alles, was du mit der GDI+ machen kannst auch mit der GDI. 😉
    GDI+ benutzt schluss entlich ja genau selbst die GDI.

    Allerdings muss ich zugeben, dass ich nicht mehr genau weiss, warum ich da ein Fenster erstellt habe. Ich vermute aber, dass es so war, damit ich die Windows Messages empfangen und verarbeiten kann. (Ist ja eigentlich nur eine Grundlage für allgemeint Gadgets gewesen, wo man doch schon sehr viele Features von Fenstern haben möchte).


Anmelden zum Antworten