![]() |
Wie funktioniert das genau mit den backbuffer?
Hallo,
Wie funktioniert das: ich zeichne auf meiner PaintBox ein objekt und möchtes es danach verschieben, vergrößeren,eigenschaften ändern und soweiter und sofort.... gut ich habe es auch geschaft in dem ich einfach das alte objekt übermale mit pmNotXor und ein neues erstelle und fertig, problem die farben werde nicht so übernommen wie ich es angeben habe !!! so nun wollte ich fragen, was die beste möglichkeit ist ein objekt zu löschen, bei meiner forensuche(delphifourm, delphipraxis) ist mir aufgefallen, das öfters gesagt wurde pmNotXor ist out, warum ? was gibst für weiter möglichkeiten ??? mein ziel ist es: ein paint zu schreiben, wo ich objekte habe die ich nach dem erstellen, verschieben, löschen, bearbeiten kann........ PS: mein qullcode bist jetzt:
Delphi-Quellcode:
der ganze qullcode ist bis jetzt 262 zeilen lang....
function TForm1.findObj(x,y:Integer):Integer;
var i,z:Integer; begin z:=-1; for i:=0 to High(Obj) do begin if (x >= obj[i].x ) and (y >= obj[i].y ) and (x <= obj[i].x + obj[i].h ) and (y <= obj[i].y + obj[i].w) then begin z:=i; Break; end end; result:=z; end; procedure TForm1.AddObj(x,y,x1,y1,typ:Integer); begin SetLength(Obj,High(obj)+2 ); Obj[High(Obj)].x:=x; Obj[High(Obj)].y:=y; Obj[High(Obj)].h:=x1-x; Obj[High(Obj)].w:=y1-y; Obj[High(Obj)].typ:=typ; Obj[High(Obj)].PenStyle:=PaintBox1.Canvas.Pen.Style; Obj[High(Obj)].BrushStyle:=PaintBox1.Canvas.Brush.Style; Obj[High(Obj)].FColor:=PaintBox1.Canvas.Pen.color; Obj[High(Obj)].Bcolor:=PaintBox1.Canvas.Brush.color; ListBox1.Items.Add('Obj' + IntToStr(Typ)); end; procedure TForm1.DrawObjt(typ,x1,y1,x2,y2:Integer; AMod:TPenMode); begin PaintBox1.Canvas.Pen.Mode:=AMod; with PaintBox1.Canvas do begin if typ = 0 then PaintBox1.canvas.Rectangle(x1,y1,x2,y2); if typ = 1 then PaintBox1.canvas.Ellipse(x1,y1,x2,y2); if typ = 2 then PaintBox1.canvas.RoundRect(x1,y1,x2,y2,(x1 - x2) div 2,(y1 - y2) div 2); if typ = 3 then begin PaintBox1.canvas.MoveTo(x1,y1); PaintBox1.canvas.LineTo(x2,y2); end; end; end; procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if Shift = [ssLeft] then MT:=True; objIndex:=FindObj(x,y); if objIndex > -1 then begin PaintBox1.Canvas.Pen.Color:=Obj[objIndex].FColor; PaintBox1.Canvas.Pen.Style:=Obj[objIndex].PenStyle; PaintBox1.Canvas.Brush.Color:=Obj[objIndex].BColor; PaintBox1.Canvas.Brush.Style:=Obj[objIndex].BrushStyle; Edit1.Color:=PaintBox1.Canvas.Brush.Color; Edit1.Font.Color:=PaintBox1.Canvas.Pen.Color; end; MX:=x;MY:=y; ox:=mx; oy:=my; end; procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin StatusBar1.Panels[1].Text:=IntToStr(x) + '\' + intToStr(y); if MT = True then begin if PenS > -1 then begin StatusBar1.Panels[0].Text:=IntToStr(ObjIndex); if objIndex = -1 then begin DrawObjt(PenS,MX,MY,ox,oy,pmCopy); ox:=x; oy:=y; DrawObjt(PenS,MX,MY,ox,oy,pmCopy); end else begin MoveObj:=True; DrawObjt(PenS,obj[ObjIndex].x,obj[ObjIndex].y,obj[ObjIndex].x+obj[ObjIndex].h,obj[ObjIndex].y+obj[ObjIndex].w,pmNotXor); Obj[objIndex].x:=x; Obj[objIndex].y:=y; DrawObjt(PenS,x,y,Obj[objIndex].x+obj[ObjIndex].h,Obj[objIndex].y+obj[ObjIndex].w,pmNotXor); end; end; end; end; |
Re: Wie funktioniert das genau mit den backbuffer?
Man zeichne4t bei einer paintbox nie direkt auf selbige, sondern immer auf ein Bitmap im Speicher und kopiert es bei Bedarf dann auf das Canvas der Peintbox (OnPaint der Paintbox oder bei Buttonklicks eben). Das Kopieren mit BitBlt ist erstens schneller als die direkte Grafikausgabe auf dem Canvas und zweitens wird so verhindert, dass Teile der Ausgabe fehlen, wenn sie von einem anderen Fenster überdeckt wurden.
|
Re: Wie funktioniert das genau mit den backbuffer?
ich habe es jetzt mit einer zweiten PaintBox versucht zu machen, aber das geht leider auch nicht wirklich, wengen den pos angaben, da ich die zweiten pb auf die größe des objekte setzte.....
könntes du mal ein kleines beispiel schreiben ??? weil ich kann es mir nicht so richtig vorstellen !!! |
Re: Wie funktioniert das genau mit den backbuffer?
Luckie meinte ja auch, dass du auf einem Bitmap im Speicher malen sollst ;-)
Ich glaube Luckie hat mal in der CodeLib ein Beispiel dazu gepostet, such am besten mal ;-) |
Re: Wie funktioniert das genau mit den backbuffer?
ich habes jetzt so gemacht, aber beim verschieben gibst probleme:
Delphi-Quellcode:
[edit=Luckie]Tags korrigiert. Mfg, Luckie[/edit]
begin
// if altezeit+30 < timegettime then begin if objIndex > -1 then begin FZSpeicher.Canvas.Pen.Color:=Obj[objIndex].FColor; FZSpeicher.Canvas.Pen.Style:=Obj[objIndex].PenStyle; FZSpeicher.Canvas.Brush.Color:=Obj[objIndex].BColor; FZSpeicher.Canvas.Brush.Style:=Obj[objIndex].BrushStyle; end else begin FZSpeicher.Canvas.Pen.Color:=JvGammaPanel1.ForegroundColor; FZSpeicher.Canvas.Brush.Color:=JvGammaPanel1.BackgroundColor; end; BitBlt(FZSpeicher.canvas.handle, 0, 0, FBackpuffer.width, FBackpuffer.height, FBackpuffer.canvas.handle, 0, 0, SRCCOPY); with FZSpeicher.Canvas do begin if typ = 0 then FZSpeicher.canvas.Rectangle(x1,y1,x2,y2); if typ = 1 then FZSpeicher.canvas.Ellipse(x1,y1,x2,y2); if typ = 2 then FZSpeicher.canvas.RoundRect(x1,y1,x2,y2,(x1 - x2) div 2,(y1 - y2) div 2); if typ = 3 then begin FZSpeicher.canvas.MoveTo(x1,y1); FZSpeicher.canvas.LineTo(x2,y2); end; // end; BitBlt(PaintBox1.canvas.handle, 0, 0, FBackpuffer.width, FBackpuffer.height, FZSpeicher.canvas.handle, 0, 0, SRCCOPY); altezeit := timegettime; end |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:33 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz