Autor Beitrag
Sephiroth
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 102



BeitragVerfasst: Fr 25.11.05 13:18 
Hallo, :)

ich hab hier im Forum folgende Routinen entdeckt, die im Prinzip genau das machen, was ich möchte. Und zwar soll der Bildschirm komplett mit einer Farbe ausgefüllt werden und mit einer weiteren Routine wieder zurückgesetzt werden.

Hier die Routinen:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
var
  tempbmp: tbitmap;

procedure clrdesk;
// alles schwarz machen, davor wird screenshot in tempbmp abgelegt;
var pc: tcanvas;
    tr: trect;
    dc: HDC;
begin
   pc := tcanvas.Create;
   DC := getdc(0);
   pc.Handle := DC;
   tr := pc.ClipRect;
   if not assigned(tempbmp) then begin
     tempbmp := tbitmap.create;
     tempbmp.Width:=tr.Right;
     tempbmp.height:=tr.bottom;
     tempbmp.Canvas.CopyRect(tr,pc,tr);
   end;
   pc.Brush.Color := clwhite;
   pc.FillRect(tr);
   releasedc(0,DC);
   pc.TryLock;
   pc.Free;
end;

procedure paintdesk;
// screenshot wird wieder drüber gemalt
var pc: tcanvas;
    DC: hdc;
    tr: trect;
begin
   if assigned(tempbmp) then begin
     DC := getdc(0);
     pc := tcanvas.Create;
     pc.Handle := DC;
     tr := pc.ClipRect;
     pc.Brush.Bitmap:=tempbmp;
     pc.FillRect(tr);
     pc.Free;
     releasedc(0,DC);
     tempbmp.Free;
     tempbmp := nil;
   end;
end;


Und jetzt meine Frage: Wenn ich diese beiden Proceduren direkt hintereinander aufrufe, dauert mir das ganze einen Tick zu lange. Gibt es ne Möglichkeit das ganze noch etwas zu beschleunigen? Ich hab auf der Suche nach einer Lösung den Befehl BitBlt gefunden, bin mir aber unsicher wie ich das integrieren soll und ob das wirklich die Lösung ist.
Evtl. kann man das mit Canvas auch gar nicht schneller Zeichnen. Ist das so?



Gruß
Sephiroth

Moderiert von user profile iconGausi: Code- durch Delphi-Tags ersetzt
Lossy eX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: Fr 25.11.05 15:29 
Also etwas was ein klein wenig was bringt ist, wenn du deine Canvasinstanz, den DC und das Temporäre Bitmap nicht jedes mal erstellst sondern diese zu Begin deiner Anwendung erstellst und beim Beenden wieder frei gibst. Bzw, wenn du lediglich mit BitBlt arbeitest, dann benötigst du die Canvas von dem Desktop auch nicht mehr.

Mit Suche im MSDN BITBLT kannst du auch arbeiten. Dieser Befehl ist ein direkter Windows GDI Befehl. Dadurch kannst du dir overhead durch die VCL ersparen. Vor allem, da CopyRect auch die Daten nicht 1:1 kopiert sondern diese auch in der Größe verändert. Evtl optimiert Windows das intern dann mit BitBlt besser. Ich persönlich habe bisher immer nur mit der VCL gearbeitet und empfand das nicht direkt als Langsam. Aber kommt auch immer drauf an was man will.

Sonnst musst du nur auf deine Parameter hören. ;-)

ausblenden Delphi-Quelltext
1:
2:
// tempbmp.Canvas.CopyRect(tr,pc,tr); enspricht dem (hoffe ich)
BitBlt(TempBmp.Canvas.Handle, 0, 0, Tr.Right, Tr.Bottom, DC, 0, 0, PATCOPY);

Das zurück kopieren funktioniert ähnlich dabei musst du lediglich die Handles austauschen. Wenn ich mich nicht vertue. Also ich gebe keine Garantie auf den Code. Habs jetzt nur so dahin geschrieben.

_________________
Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.