AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Zeichenfläche begrenzen/schützen
Thema durchsuchen
Ansicht
Themen-Optionen

Zeichenfläche begrenzen/schützen

Ein Thema von bernau · begonnen am 27. Mai 2005 · letzter Beitrag vom 30. Mai 2005
Antwort Antwort
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.294 Beiträge
 
Delphi 12 Athens
 
#1

Zeichenfläche begrenzen/schützen

  Alt 27. Mai 2005, 19:10
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
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: Zeichenfläche begrenzen/schützen

  Alt 27. Mai 2005, 19:16
Hi,

kennst du schon die Eigenschaft ClipRect von TCanvas?

Grüße vom marabu
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.294 Beiträge
 
Delphi 12 Athens
 
#3

Re: Zeichenfläche begrenzen/schützen

  Alt 27. Mai 2005, 19:20
Zitat von marabu:
kennst du schon die Eigenschaft ClipRect von TCanvas?
Ja. Habe ich schon versucht.
Ist ReadOnly!
Was soll ich damit machen?


Gerd
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: Zeichenfläche begrenzen/schützen

  Alt 27. Mai 2005, 19:23
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
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.294 Beiträge
 
Delphi 12 Athens
 
#5

Re: Zeichenfläche begrenzen/schützen

  Alt 27. Mai 2005, 19:29
Merci,

das war das, was ich gesucht habe.

Gerd
  Mit Zitat antworten Zitat
Benutzerbild von Flogo
Flogo

Registriert seit: 24. Mär 2003
Ort: Freiburg im Breisgau
317 Beiträge
 
Delphi 7 Professional
 
#6

Re: Zeichenfläche begrenzen/schützen

  Alt 27. Mai 2005, 22:49
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
If one coincidence can occur, then another coincidence can occur. And if one coincidence happens to occur just after another coincidence, then that is just a coincidence.
DNA

www.Anyxist.de
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#7

Re: Zeichenfläche begrenzen/schützen

  Alt 28. Mai 2005, 15:39
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
  Mit Zitat antworten Zitat
Benutzerbild von Flogo
Flogo

Registriert seit: 24. Mär 2003
Ort: Freiburg im Breisgau
317 Beiträge
 
Delphi 7 Professional
 
#8

Re: Zeichenfläche begrenzen/schützen

  Alt 29. Mai 2005, 14:43
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
If one coincidence can occur, then another coincidence can occur. And if one coincidence happens to occur just after another coincidence, then that is just a coincidence.
DNA

www.Anyxist.de
  Mit Zitat antworten Zitat
Benutzerbild von Flogo
Flogo

Registriert seit: 24. Mär 2003
Ort: Freiburg im Breisgau
317 Beiträge
 
Delphi 7 Professional
 
#9

Re: Zeichenfläche begrenzen/schützen

  Alt 30. Mai 2005, 17:05
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
If one coincidence can occur, then another coincidence can occur. And if one coincidence happens to occur just after another coincidence, then that is just a coincidence.
DNA

www.Anyxist.de
  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:38 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