AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Wie funktioniert das genau mit den backbuffer?
Thema durchsuchen
Ansicht
Themen-Optionen

Wie funktioniert das genau mit den backbuffer?

Ein Thema von mimi · begonnen am 15. Aug 2004 · letzter Beitrag vom 15. Aug 2004
Antwort Antwort
mimi

Registriert seit: 1. Dez 2002
Ort: Oldenburg(Oldenburg)
2.008 Beiträge
 
FreePascal / Lazarus
 
#1

Wie funktioniert das genau mit den backbuffer?

  Alt 15. Aug 2004, 11:36
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:
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;
der ganze qullcode ist bis jetzt 262 zeilen lang....
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Wie funktioniert das genau mit den backbuffer?

  Alt 15. Aug 2004, 12:19
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
mimi

Registriert seit: 1. Dez 2002
Ort: Oldenburg(Oldenburg)
2.008 Beiträge
 
FreePascal / Lazarus
 
#3

Re: Wie funktioniert das genau mit den backbuffer?

  Alt 15. Aug 2004, 13:21
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 !!!
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  Mit Zitat antworten Zitat
Alexander

Registriert seit: 28. Aug 2002
Ort: Oldenburg
3.513 Beiträge
 
Turbo Delphi für .NET
 
#4

Re: Wie funktioniert das genau mit den backbuffer?

  Alt 15. Aug 2004, 14:10
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
Alexander
  Mit Zitat antworten Zitat
mimi

Registriert seit: 1. Dez 2002
Ort: Oldenburg(Oldenburg)
2.008 Beiträge
 
FreePascal / Lazarus
 
#5

Re: Wie funktioniert das genau mit den backbuffer?

  Alt 15. Aug 2004, 14:17
ich habes jetzt so gemacht, aber beim verschieben gibst probleme:
Delphi-Quellcode:
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
[edit=Luckie]Tags korrigiert. Mfg, Luckie[/edit]
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:27 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz