auf Desktop zeichnen
-
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.
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
supersass1P.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,
TippoEdit 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.htmlAnsonsten 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
TippoEdit: bin doch noch schnell dazu gekommen:
Das Beispielproject. Anmerkungen finden sich im Quelltext!
-
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
TippoEdit: 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.