Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Zeichenfläche begrenzen/schützen (https://www.delphipraxis.net/46581-zeichenflaeche-begrenzen-schuetzen.html)

bernau 27. Mai 2005 18:10


Zeichenfläche begrenzen/schützen
 
Hi,


folgendes Problem:


Ich habe einen Canvas in der mit den Abmessungen 3000*6000 Pixel

Auf diesem Canvas werden verschiedene Zeichenoperationen mit Textout, rectangle, etc. durchgeführt.

Ich möchte, daß auf dem Canvas diese Funktionen erst ab Pixel 1500 bis Pixel 3000 gezeichnet werden kann. Der Bereich von Pixel 0 bis 1499 soll nicht verändert werden. Grob gesagt. Die Linke Seiten vom der Zeichenfläche soll geschützt von Zeichenoperationen sein.

Hat irgendjemand eine Idee.


Gerd

marabu 27. Mai 2005 18:16

Re: Zeichenfläche begrenzen/schützen
 
Hi,

kennst du schon die Eigenschaft ClipRect von TCanvas?

Grüße vom marabu

bernau 27. Mai 2005 18:20

Re: Zeichenfläche begrenzen/schützen
 
Zitat:

Zitat von marabu
kennst du schon die Eigenschaft ClipRect von TCanvas?

Ja. Habe ich schon versucht.
Ist ReadOnly!
Was soll ich damit machen?


Gerd

marabu 27. Mai 2005 18:23

Re: Zeichenfläche begrenzen/schützen
 
Zitat:

Zitat von Borland
Delphi-Quellcode:
procedure Form1.Button1Click(Sender: TObject);
var
  MyRgn: HRGN ;
begin
  MyRgn := CreateRectRgn(100,100,200,200);
  SelectClipRgn(Image1.Canvas.Handle,MyRgn);
  Image1.Canvas.Brush.Color := clRed;
  Image1.Canvas.FillRect(Image1.Canvas.ClipRect);
  Image1.Invalidate;
  SelectClipRgn(Image1.Canvas.Handle,nil);
  DeleteObject(MyRgn);
end;

Freundliche Grüße vom marabu

bernau 27. Mai 2005 18:29

Re: Zeichenfläche begrenzen/schützen
 
Merci,

das war das, was ich gesucht habe.

Gerd

Flogo 27. Mai 2005 21:49

Re: Zeichenfläche begrenzen/schützen
 
Gibt es auch irgendeine elegante Möglichkeit das mit DelphiX zu lösen?
In DelphiX werden ja alle Sprites von der SpriteEngine verwaltet, die nacheinander deren DoDraw-Methode aufruft.
Mein Ziel ist einen bestimmten Typ von Sprites nur in einem bestimmten Bereich zu zeichnen.

Spontan (nachdem ich zufällig diesen Thread hier gefunden hab) fällt mir folgendes dazu ein:

Delphi-Quellcode:
procedure MeinSpriteTyp.DoDraw;
var
  MyRgn: HRGN ;
begin
  MyRgn := CreateRectRgn(100,100,200,200);
  SelectClipRgn(Engine.Surface.Canvas.Handle,MyRgn);
  inherited;
  SelectClipRgn(Image1.Canvas.Handle,nil);
  DeleteObject(MyRgn);
end;

Da das aber von einem Timer aufgerufen wird und vor allem mit mehreren Sprites passieren muss, sieht das sehr nach einer heißlaufenden CPU aus.
Das ich die ClipRegion dauerhaft setzte geht leider auch nicht da in den anderen Bereichen eben andere Sprites gemalt werden sollen

marabu 28. Mai 2005 14:39

Re: Zeichenfläche begrenzen/schützen
 
Hallo flogo,

ich grübele darüber, welchen Vorteil dir eine ClipRegion verschaffen könnte. Für den Benutzer deines Programmes sieht es ja so aus, als ob ein Sprite in seinem eigenen Layer unterwegs sei, wobei das ClipRect einen Fensterblick auf diesen Layer durch alle Decklayer ermöglicht.

Auch wenn ein Clipping stattfindet, bewegt sich das Sprite ja weiter, wird lediglich unsichtbar, keiner weiß mehr wo es ist - außer deinem Programm. Brauchst du nicht eher eine Bounding Box, bei der ein Sprite am Verlassen einer Region gehindert wird?

Grüße vom marabu

Flogo 29. Mai 2005 13:43

Re: Zeichenfläche begrenzen/schützen
 
Leider nein. Es geht hier konkret um das Inventory in einem Adventure. Dieses soll am unteren Bildschirmrand eingeblendet werden können. Die Teile, die man im Inventory hat soll man in der Mitte hin- und herscrollen können. Es gibt also einen Bereich in dem man eine bestimmte Anzahl dieser Gegenstände sehen kann und rechts und links davon zwei Pfeile mit denen man scrollen kann. Wenn sich ein Item jetzt nach links bewegt, soll es natürlich hinter dem Pfeil (bzw. schon vorher hinter einem Rahmen) verschwinden.
Das Problem dabei ist das ein/ausfaden des Inventorys. Ich habe leider in DelphiX nur eine (leichte) Möglichkeit gefunden den Fade nur für bestimmte Sprites zu machen und das ist ein Alphablending vor einem schwarzem Hintergrund. Wenn ich die Pfeile einfach als Sprites vor die Gegenstände lege, vermischen sich deren Farben beim Fade.
Bis jetzt hatte ich es so geregelt, dass ich je ein komplett schwarzes Bild hinter die Pfeile (und vor die Items) gelegt hab und ich denke ich werde dabei bleiben, weil sich das Clipping doch zu rechenintensiv anhört

Flogo 30. Mai 2005 16:05

Re: Zeichenfläche begrenzen/schützen
 
Ich hab mich jetzt durch den Code von DelphiX gekämpft und bin soweit gekommen:

Delphi-Quellcode:
procedure TMyImageSprite.DoDraw;
var DestRect, SrcRect: TRect;
begin
  DestRect := Rect(max(BoundsRect.Left, Trunc(Parent.X)),
                   max(BoundsRect.Top, Trunc(Parent.Y)),
                   min(BoundsRect.Right, Trunc(Parent.X) + Parent.Width),
                   min(BoundsRect.Bottom, Trunc(Parent.Y) + Parent.Height));
  SrcRect := DestRect;
  OffsetRect(SrcRect, -BoundsRect.Left, -BoundsRect.Top);
  Engine.Surface.DrawAlpha(DestRect, SrcRect, Image.PatternSurfaces[0], false, 200);
end;
Als Clipping-Box wird hier ein TSprite (ohne Bild) verwendet, das beim Erstellen der Items als Parent mitgegeben wird)

Ich denke das dieser Code ausreichend effektiv ist, da DelphiX das Zeichnen intern ähnlich erledigt. Nur die erste Zeile (ok ersten vier Zeilen in dem Fall) kommt dazu und die sieht ja noch irgendwie erträglich aus.

Wenn das noch jemand benutzen will, sollte ich vielleicht vorwarnen:
Das Beispiel geht davon aus das Bildgröße und Spritegröße übereinstimmen und zeichnet das Bild immer ohne Transparenz (..aces[0], false, 20...) und mit einem Alpha von 200 (.., false, 200); )
Während sich die letzten beiden Sachen relativ leicht ändern lassen müsste eine Animation mit mehreren Frames bzw. ein Bild das kleiner oder größer ist als das Sprite (tiled := true, ...) nachgerüstet werden


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:39 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