auf Desktop zeichnen



  • Dan Zulla schrieb:

    Tippokrates schrieb:

    Wie gesagt, ist kein Virus oder so drauf, ist ja von mir und auch auf meinem Server.

    Freiheit statt Angst - Für die Grundrechte - und wenn du keinen Virus verbreiten willst, lad ich mir auch nix von deinem Server. Informatikstudenten sind mir eh ein Greuel.

    Hi Dan: Is doch dein Server ^^ Nur wenn ich schreibe der Server von wem anders dann klingt das nicht so ob ich dem Server selber vertraue, oder? 😉

    Informatikstudent bin ich auch noch nicht, hab zwar meinen Studienplatz, kann aber noch nicht loslegen (zu jung)

    So, zurück zum Thema: Ja ok, ich schiebe heute abend noch ne zip mit dem ganzen Projekt auf die Adresse. habe jetzt keinen Zugriff, wegen Schule...

    MfG
    Tippo



  • Tippokrates schrieb:

    Wenn du mir das evtl für Delphi zeigen kannst, dann wäre das sicher nen Versuch wert! Dann könnte ich das auch weiter mit der VCL machen.

    Ja das ist kein Problem,in Delphi sieht das wie folgt aus:

    Deklarieren der Variablen

    var
      DC        : HDC;
      Canvas    : TCanvas;
      Bitmap    : TBitmap;
    //nach dem : steht der Typ
    

    DC vom Desktop holen

    DC := GetWindowDC(GetDesktopWindow());
    

    Canvas erstellen, handlen, und zeichnen

    Canvas := TCanvas.Create();
    Canvas.Handle := DC;
    Canvas.Draw(0,0, "das zu malenen Bitmap");
    

    canvas freigeben

    ReleaseDC(0, DC);
    

    das ganze sieht dan folgendermaßen aus:

    procedure TForm1.DrawPicture(c1:integer=0;c2:integer=0;c3:integer=0;c4:integer=0);
    var
      DC        : HDC;
      Canvas    : TCanvas;
      Bitmap    : TBitmap;
    
    begin
      begin
        Bitmap := TBitmap.Create();
        try
            Bitmap.Height := 600;
            Bitmap.Width := 600;
          Bitmap.Canvas.Brush.Color:=RGB(255,0,50);
          Bitmap.Canvas.Brush.Style:=bsSolid;
          Bitmap.Canvas.Pen.Width:=5;
          Bitmap.Canvas.Ellipse(c1,c2,c3,c4);
    
          // Wir holen uns den 'Device Context' vom Desktop
          DC := GetWindowDC(GetDesktopWindow());
    
          //DC := GetWindowDC(GetForegroundWindow());
    
          try
            Canvas := TCanvas.Create();
            try
              // Wir weisen den DC dem Canvas zu
              Canvas.Handle := DC;
              // Das Bild wird an Left / Top auf den Desktop gezeichnet
              Canvas.Draw(0,0, Bitmap);
            finally
              Canvas.Free;
            end;
          finally
            ReleaseDC(0, DC);
          end;
        finally
          Bitmap.Free;
        end;
      end;
    end;
    

    Aufrufen tut man die Funktion dann mit den 4 Parametern:

    Draw.Picture(1,2,3,4);
    

    Es ist nichts besonderes, es wird ledigliche ein Kreis gezeichnet.

    PS: Ja, die Grafik ist eigentlich fertig, habs zu angucken mal auf meinen Server gepackt als exe, da kann man sich das vlt besser vorstellen.

    http://tippo.webnerd.de/radar.exe

    Mich interessiert, wie du das gemacht hast, mit VCL. Ich kann mit Delphi zeichnen, aber nich mit C++, oder nur schwer mit C++. Hast du vielleicht ein Tutorial dazu?

    viele liebe grüße
    supersass1

    P.S.: Welche Klasse gehst du, dass du dich schon um ein Studiumplatz kümmerst?



  • Jo, danke für den Delphi Code, ich denke das ist einen Versuch wert das mal umzuschreiben, denn an sich ist da alles ziemlich ähnlich in der VCL und mit dem BCB 6 ist das ja eh alle mit Delphi und so...
    Leider werde ich erst heute abend oder nächste Woche dazu kommen, muss viel lernen weil Klausuren anstehen.

    Also ich gehe zZt in die 12. Klasse in Thüringen, und mache also nächstes Jahr Abitur. Was ich studiere weiss ich daher, da ich mich bei der Bundeswehr beworben hae und ein Informatikstudium an der Universität in München zugesagt bekommen habe.

    Das Projekt findest du unter http://tippo.webnerd.de/radar_project.rar. Ist alles drin was du brauchst. Für Canvas kenne ich kein gutes Tutorial, ich habs aus nem Buch, aber die Hilfe dazu ist eigentlich gut dokumentiert, und eigentlich genau wie in Delphi 😉

    Einen schönen Tag noch,
    Tippo

    Edit wie angekündigt

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
      HDC DC;
      TCanvas * FCanvas = new TCanvas();
      Graphics::TBitmap *BrushBmp = new Graphics::TBitmap;
      BrushBmp->Width = 800;
      BrushBmp->Height = 600;
      BrushBmp->Canvas->Brush->Color = clRed;
      BrushBmp->Canvas->Ellipse(0,0,800,600);
    
      DC = GetWindowDC(GetDesktopWindow());
      FCanvas->Handle = DC;
      FCanvas->Draw(0,0,BrushBmp);
    
      ReleaseDC(0, DC);
    
      delete BrushBmp;
      delete FCanvas;
    }
    

    Jop! Das zeichnet schon mal... zwar auf den Desktop soweit ich das beurteilen kann, aber ich will es ja HINTER die Icons und nicht davor so wie das wäre.

    Aber ich hab da schon so eine idee... aber vlt sieht ja wer wie ich das hinter die icosn bringe... morgen mehr...



  • du zeichnest ja momentan ein Bitmap, und diese lädst du dann in den DC des Desktops.

    Würdest du das Bitmap speichern können, wäre sicherlichauch soetwas möglich:
    http://www.c-plusplus.net/forum/viewtopic-var-p-is-83030.html

    Ansonsten könnte ich mir vorstellen, dass es eine Funktion gibts, um das Background-Picture des Desktops zu ändern, da dann einem dein Bitmap einsetzen.

    mfg supersass1



  • Badestrand schrieb:

    Evtl kannst du das Desktopfenster hooken (Boardsuche nach SetWindowsHookEx) und beim Hintergrund-zeichnen dein Fenster draufzeichnen lassen?

    Mal ausprobiert? Irgendwie gehts auf jeden Fall, der VLC Media Player kann auch die Videos hinter den Desktop-Icons abspielen, als Hintergrundbild quasi; und weil der OpenSource ist, könnte man da abgucken, dürfte aber nicht so einfach sein, ich glaube der löst das irgendwie mit DirectX.. Naja, Hook ausprobiert?



  • SetWindowsHookEx
    

    Sagt mir leider gar nichts... Da müsste ich mir jetzt erst mal Grundlagen zu aneigenen eh ich an dem Projekt weiter arbeiten kann.

    Das Problem ist, wenn ich eine neue TBitmap erstelle, sie speichere, und als Wallpaper setze, dann funzt das auch.

    Nur Meine Grafik wird in einem Timer erzeugt (siehe exe), also ziemlich häufig, und wenn ich dann alle (paar) Sekunde(n) ein neues Wallpaper setze, dann gibts das große Flackern. Und das will ja niemand sehen.

    Hat denn noch niemand sowas mal gemacht, was bewegtes auf den Desktop bringen? Das von dem VLC Player das kenne ich, aber da spielen noch ganz andere Sachen eine Rolle von denen ich nichts verstehe. Ich will das ja auch einfach halten und nicth Videos abspielen... 😉

    MfG
    Tippo



  • mit der HOOK-Geschichte kann ich dir auch nicht weiterhelfen, da habe ich auch nur von gehört.

    Das mit dem Flackern kommt mir bekannt vor, aus Delphi 😉
    Ich würde deine .exe gerne mal sehen.

    Ich könnte mir vorstellen, dass du vielleicht ein Bitmap unter das, welches sich milli-sekündlich ändert, malst, vielleicht verhindert dies ein flackern.

    Ansonsten würde ich das mit dem Hook versuchen, versuche statt eines Bitmaps, dein Windows als Background zu malen.

    Halt uns auf dem laufenden 😉
    mfg supersass1



  • Tippokrates schrieb:

    Hat denn noch niemand sowas mal gemacht, was bewegtes auf den Desktop bringen?

    Hi! Die Antwort wird dir nicht gefallen. 🙂 Diese Idee verwirft ein Profi, weil er weiß, welche Funktion ein Desktop hat! HTH - sarabande



  • Die meiner Meinung nach beste Methode: HTML-Datei mit eingebettetem ActiveX-Objekt als Desktop-Hintergrund einbetten.

    oder eine feste Hintergrundfarbe setzen und mit DirectX/DirectShow nen Overlay drauf kloppen.



  • Hm, mit Overlay da hab ich schon mal was mit Delphi gesehen bzw. auch hier liegen.

    @Sarabande: Tja der Desktop soll ja nicht mehr nur noch zum Arbeiten sein, er soll ja auch gut aussehen ^^ Aber Recht haste ja eigentlich.

    Aber bei vielen Problemen geht es doch ehr darum WIE und OB es geht, nicht ob man es wirklich braucht.

    Ja gut, eine HTML als Desktophintergrund funzt auch, is richtig. Aber ist halt nicht C++ 😉

    Ich sehe schon hier gibt es noch ein paar die das intreressiert, ich stelle mein Projekt nochmal online und verlinke es hier, aber heute werde ich nicht mehr dazu kommen.

    MfG
    Tippo

    Edit: bin doch noch schnell dazu gekommen:

    Das Beispielproject. Anmerkungen finden sich im Quelltext!

    http://tippo.webnerd.de/Desktop.rar



  • finde ich ne echt schöne Sache, wenn das noch mit WinAPI wäre 😉

    Was für einen Programm zum Coden und Compilieren benutzt du?

    Zu deiner Frage, wie es nicht flackern würde.
    In Delphi gab es eine Funktion, die ich nicht mehr weiß, um den Desktop zu refreshen, dies geschieht offensichtlich automatisch in deinem Programm, jedes Mal, wenn quasi ein neuen Bitmap geladen wird.
    Nun muss man nur diese Refreshen verbieten, was bestimmt nicht einfach ist, da dies bestimmt tief im Inneren von Windows so programmiert ist, um damit einen natlosen Übergang zu haben.

    mfg supersass1



  • supersass1 schrieb:

    finde ich ne echt schöne Sache, wenn das noch mit WinAPI wäre 😉

    Was für einen Programm zum Coden und Compilieren benutzt du?

    Tja, der WinApi Code hat mir nicht so gut gefallen wie das was ich kenne.
    "Was der Bauer nicht kennt, das coded er nicht!"

    Ich benutze den Borland C++ Builder 6 also VCL. Jetzt frag bitte nicht wie ich dann ins WinApi Forum gekommen bin, irgendein Modrator hat mich verschoben. Dem schien das wohl ehr hier hinzugehören...

    Naja, das refreshen kommt ja dadurch das ich jedesmal eine neue bmp erzeuge und als Wallpaper setze. Ganz einfach. (Ich beziehe mich auch Timer1)

    Aber ich suche ja eine Möglichkeit das Timer2 hinter die DesktopIcons kommt..

    void __fastcall TForm1::Timer2Timer(TObject *Sender)
    {
      //  Timer2 zeichnet auf den Desktop,
      // jedoch nicht hinter die Icons, sondern davor
    
      i += 10;
      Form1->Caption = IntToStr(i);
    
      HDC DC;
      TCanvas * FCanvas = new TCanvas();
      Graphics::TBitmap *BrushBmp = new Graphics::TBitmap;
      BrushBmp->Width = 800;
      BrushBmp->Height = 600;
      BrushBmp->Canvas->Brush->Color = clRed;
      BrushBmp->Canvas->Ellipse(0,0,400 + i ,300 + i);
    
      DC = GetWindowDC(GetDesktopWindow());
      FCanvas->Handle = DC;
      FCanvas->Draw(0,0,BrushBmp);
    
      ReleaseDC(0, DC);
    
      delete BrushBmp;
      delete FCanvas;
    }
    //---------------------------------------------------------------------------
    

    Eigentlich dürfte da doch nur ein Handle oder der Release falsch sein, aber wie ist er richtig? Ich hab damit keine Erfahrungen...

    MfG
    Tippo



  • Hallo Leute!

    Sry wegen dem Doppelpost, aber es ergibt keine Sinn wenn ich den vorhergehenden Beitrag editiere.

    http://tippo.webnerd.de/Desktop.rar

    Schaut euch da mal "Variation" an.

    HWND hProgMan  = FindWindow("ProgMan", NULL);  
      HWND hShellDef = FindWindowEx(hProgMan, NULL, "SHELLDLL_DefView", NULL);
      HWND hDesktopWnd    = FindWindowEx(hShellDef, NULL, "SysListView32", NULL);
      HDC DC;
    
      TCanvas * FCanvas = new TCanvas();
      Graphics::TBitmap *BrushBmp = new Graphics::TBitmap;
      BrushBmp->Width = 800;
      BrushBmp->Height = 600;
      BrushBmp->Canvas->Brush->Color = clRed;
      BrushBmp->Canvas->Ellipse(0,0,400 + i ,300 + i);
    
      DC = DC = GetWindowDC(hDesktopWnd);
      FCanvas->Handle = DC;
      FCanvas->Draw(0,0,BrushBmp);
    
      ReleaseDC(0, DC);
    
      delete BrushBmp;
      delete FCanvas;
    

    Das zeichnet zumindest schon mal HINTER alle aktiven Fenster, und nicht so dominant davor 🙂

    Und eine Lösung für unser Problem habe ich auch gefunden, im Internet nachdem ich mal bei den Delphi Leuten nachgeschaut habe. (@supersass1 das du das da nicht gefunden hast 😉 )

    http://www.angelcode.com/dev/desktopdraw/

    Aber der Code der da angeboten wird ist ziemlich schwierig und mir persönlich bereiten zwei Sachen dabei Schmerzen 1) ich komme immer noch nicht mit den dlls klar 2) ich mag nicht code einbinden den ich nicht zu 100% verstehe...

    Aber Vielleicht hilft es euch weiter falls euch das auch interessiert oder wenn mal wieder wer den Thread ausgräbt ^^

    MfG
    Tippo

    Edit: ganz vergessen zu sagen, dass ja Badestrand von Anfang an zu WindowEx geraten hat



  • was macht dein Projekt, wie weit bist du?



  • Hi!

    Sry, dass ich dieses Thema wieder ausgrabe.
    Aber ich wollt wissen, ob schon jemand eine Möglichkeit gefunden hat, es hinter die Icons zu bringen.


Anmelden zum Antworten