Problem mit TImage und CopyRect
-
Hallo,
ich habe folgendes Problem:
ich wollte ein Programm schreiben (eine Art Tages-Countdown zu einem bestimmten Datum), in dem es so aussehen soll, alls seien die Labels direkt auf den Desktop gezeichnet. Ich habe ein Image (Align = alClient) eingefügt und darauf die Labels (mit Transparent=true). Dann habe ich die Funktion MakeScreenShot() geschrieben, die den Bereich unter dem Form in das Image kopiert:void __fastcall TForm1::MakeScreenShot() { x = Left; y = Top; Hide(); canvas->Handle = dc; TRect Dest = Image1->ClientRect; TRect Source = Rect(x,y,x+Width,y+Height); Image1->Canvas->CopyRect(Dest, canvas, Source); Show(); }
Diese Funktion rufe ich beim starten des Programmes auf (da funktioniert sie immer wunderbar). Es sieht nun tatsächlich so aus, als seien die Labels direkt auf den Desktop gezeichnet.
Dann habe ich den Code von Forms - ohne Titelleiste verschieben benutzt, damit man das Fenster auch verschieben kann (onMouseDown vom Image verwendet). Dann will ich, dass sobald man aufhört das Fenster zu verschieben wieder das Image mit dem "aktuellen Hintergrund" gefüllt wird. Dazu rufe ich bei OnMouseUp des Images wieder die Funktion MakeScreenShot() auf. Das funktioniert aber nur bei ca. jedem fünften mal gescheit. Ansonsten bleibt im Image der alte Inhalt, so als würde die Funktion nicht aufgerufen werden (was sie aber definitiv wird). Beim PC von meinem Freund funktioniert es noch weniger oft. (Ich habe WinXP Home und er Professional).
Hat irgend jemand eine Ahnung woran das liegen könnte, dass das nur so selten funktionert? Könnte es an XP liegen oder habe ich irgendwas falsch gemacht?Im Voraus vielen Dank
Robert
-
Schonmal dran gedacht wovon du in diesem Moment wo du die Funktion Aufrufst einen Screenshot machst
? Ich vermute mal du vergisst das Fenster vorher auszublenden und haust dir dann natürlich wieder genau das auf den Canvas was vorher zu sehen war weil du auch das kopierst. Eigentlich dürfte das dann aber NIE funktionieren. Bye.
[EDIT] Sorry, hatte mir deinen Code gar nicht angeschaut... Na vieleicht wird das Fenster mit Hide nicht schnell genug ausgeblendet ?
[ Dieser Beitrag wurde am 26.02.2003 um 17:34 Uhr von etechniker editiert. ]
-
Kein Problem.
Daran, dass das Fenster nicht schnell genug ausgeblendet wird, habe ich auch schon gedacht. Das einzige was mir dazu eingefallen ist, ist
Application->ProcessMessages();
aber auch wenn ich das in jede zweite Zeile meiner Funktion schreibe funktioniert es manchmal nicht
Ich hab echt keine Ahnung woran das liegen kann...
-
Hm.. zur Probe ob es wirklich daran liegt könntest du ja mal ein Sleep(1000) da reinhauen. Ansonsten vieleicht ein "while (Form1->Visible);" (keine Ahnung ob das was bringt ?
-
Muss ich mal ausprobieren.
Mir ist noch etwas eingefallen. Ich hab mal zum Test, ob die Funktion auch wirklich immer aufgerufen wird ganz an den Anfang der Funktion
ShowMessage("Funktion aufgerufen!");
geschrieben und dann hat es (zumindest bei mir) jedesmal funktioniert!!
Das deutet ja darauf hin, dass irgendetwas nicht schnell genug geht. Aber warum funktioniert es dann mit Application->ProcessMessages() nicht oder wende ich es falsch an?
-
Die Frage ist, WO du es anwendest. Aber deine Lösung ist sowieso nicht gut. Sieht doch scheiße aus, wenn das Fenster für ne kurze Zeit verschwindet. Du solltest dir das Desktop in einen Backbuffer-Bitmap hauen. Aus dem heraus kannst du dann immer wieder CopyRect() machen.
-
Und was ist, wenn jetzt jemand mein Fenster z.B. über dem Word-Fenster anzeigen lässt? Dann hab ich als Hintergrund das, was dort auf dem Desktop zu sehen ist und das schaut doch dann auch scheiße aus.
-
Hmm, warte mal... sollen die Labels jetzt IMMEr zu sehen sein (immer im Vordergrund) oder nur auf dem Desktop?
-
Schau Dir mal meinen Beitrag an in
'TForm transparent' von BOWSERDa kriegste ne hohle Form!!!
zwischen Deinen Elementen ist alles hinter der Form zu sehen/ anzusprechen!
Da braucht's kein Screenshoot, da sieht man live
(auch wenn das Fenster ueber WORD geschoben wird)
[ Dieser Beitrag wurde am 26.02.2003 um 20:50 Uhr von DerAltenburger editiert. ]