Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Bereiche festlegen (https://www.delphipraxis.net/40704-bereiche-festlegen.html)

Remake 19. Feb 2005 18:04


Bereiche festlegen
 
Hi.

Ich möchte auf einem Spielfeld Bereiche festlegen. Wenn man dann auf so einen Bereich klickt, löst dieser ein Ereignis aus.
Gibt es dafür irgendwelche Lösungen, oder soll ich das Spielfeld (Image) "zerschneiden", sodass die dann entstehenden kleineren Images dann diese Bereiche darstellen und bei klick auf diese dann die Ereignisse ausgelöst werden?

Gruß
Remake

Flogo 19. Feb 2005 18:10

Re: Bereiche festlegen
 
Du könntest es mit Regions versuchen. Hier im Forum suchenhrgn
Einfach die Bereiche mit CreateRectRegion() erstellen und mit PtInRegion beim Klick abfragen

Remake 20. Feb 2005 13:02

Re: Bereiche festlegen
 
ok, mal sehen ob ich dich richtig verstanden habe:
meinst du mit Regions einfach sowas wie Rechtecke (also CreateRectRgn())?
Ich erzeuge quasi einfach rechteckige Bereiche, die aber nicht sichtbar sind. Wie kann ich bei denen dann das OnClick Ereignis ansteuern?

sniper_w 20. Feb 2005 13:13

Re: Bereiche festlegen
 
Du nimmst eine Componente mit dem Canvas Property(HDC ist hier wichtig), machst deine Regions und dann mit SelectObject machst du sie gültig. Und dann wenn ein OnXXX Ereignis mit dem Mouse ausgelöst ist, prüfst du mit PtnInRgn ob du da bist wo du es auch wolltest.
Das nur wenn du es mit dem regions machen willst.
Zitat:

An application creates a region by calling a function associated with a specific shape. The following table shows the function(s) associated with each of the standard shapes.

Shape Function
Rectangular region CreateRectRgn, CreateRectRgnIndirect
Rectangular region with rounded corners CreateRoundRectRgn
Elliptical region CreateEllipticRgn, CreateEllipticRgnIndirect
Polygonal region CreatePolygonRgn, CreatePolyPolygonRgn


Each region creation function returns a handle that identifies the new region. An application can use this handle to select the region into a device context by calling the SelectObject function and supplying this handle as the second argument. After a region is selected into a device context, the application can perform various operations on it.

sniper_w 20. Feb 2005 13:32

Re: Bereiche festlegen
 
Ein Beispiel :

Delphi-Quellcode:
type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  region : HRGN;
  done : boolean = false;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
 var temp:HRGN;
begin
 region := CreateRectRgn(100,100,400,200);
 temp := CreateEllipticRgn(100,100,400,200);
 SelectObject(canvas.Handle,region);

 if COMPLEXREGION <> CombineRgn(region,region,temp,RGN_DIFF)then
        Application.MessageBox('Geht nicht.','Fehler');

 Canvas.Brush.Color := clRed;
 PaintRgn(canvas.Handle,region);

 Canvas.Brush.Color := clBlack;
 FrameRgn(canvas.Handle,region,canvas.Brush.Handle,1,1);

 done := true;
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
 if done then
        begin
 Canvas.Brush.Color := clRed;
 PaintRgn(canvas.Handle,region);

 Canvas.Brush.Color := clBlack;
 FrameRgn(canvas.Handle,region,canvas.Brush.Handle,1,1);
        end;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
 if done then
        if PtInRegion(region,x,y) then
                Label1.Caption := 'Maus ist drin.'
                else
                Label1.Caption := 'Maus ist raus.'
end;

Remake 2. Mär 2005 19:30

Re: Bereiche festlegen
 
So, jetzt hab ich endlich auch wieder Zeit zum Antworten...
danke für dein konkretes Beispiel erstmal.

Aber ich verstehe irgendwie die Komponente CreateRectRgn() nicht ganz...
Es geht um die Angaben in der Klammer. Ich habe es so interpretiert: CreateRectRgn(AbstandLinks,AbstandOben,Breite,Höhe ).

Aber wenn ich das Rechteck auf eine Position > 100/200 (das validiert auch merke ich gerade) bringen will, dann macht er das nicht, sondern geht nur bis XXX Pixel und hängt den Rest an die Breite und/oder die Höhe des Rechtecks dran. Ich glaube jedenfalls, dass er das macht. Jedenfalls verschiebt er es nicht weiter von oben und von links, als XXX Pixel. Wenn man etwas höheres eingibt, ändert sich die Größe des Rechtecks.
Also das ganze habe ich mir in sniper_w's Beispiel angeguckt, weil er das Rechteck ja färbt.

Was mache ich falsch? ...

sniper_w 2. Mär 2005 20:00

Re: Bereiche festlegen
 
Zitat:

Aber ich verstehe irgendwie die Komponente CreateRectRgn() nicht ganz...
Es geht um die Angaben in der Klammer. Ich habe es so interpretiert: CreateRectRgn(AbstandLinks,AbstandOben,Breite,Höhe ).
CreateRectRgn() ist keine Komponente, sondern eine Win API Funktion. Die Angaben in der Klammer sind genau so zu verstehen wie bei der z.B. Canvas.Rectangle().
z.B:
Delphi-Quellcode:
var p1,p1 : TPoint;
begin
  p1 := Point(x1,y1);
  p2 := Point(x2,y2);
 
  Canvas.Rectangle(p1.x,p1.y, p2.x,p2.y);
end;
Zitat:

Rectangle(
int nLeftRect, // x-coord. of bounding rectangle's upper-left corner
int nTopRect, // y-coord. of bounding rectangle's upper-left corner
int nRightRect, // x-coord. of bounding rectangle's lower-right corner
int nBottomRect // y-coord. of bounding rectangle's lower-right corner
);

Binärbaum 2. Mär 2005 20:50

Re: Bereiche festlegen
 
Zitat:

Zitat von sniper_w
Delphi-Quellcode:
var p1,p1 : TPoint;
begin
  p1 := Point(x1,y1);
  p2 := Point(x2,y2);
 
  Canvas.Rectangle(p1.x,p1.y, p2.x,p2.y);
end;

Sollte die erste Zeile nicht lieber
Delphi-Quellcode:
var p1,p2 : TPoint;
heißen? Sonst deklariert man ja zweimal eine Variable mit gleichem Bezeichner. Da kommt meist eine Fehlermeldung wie "Identifier redeclared" oder so ähnlich.

MfG
Binärbaum

sniper_w 2. Mär 2005 20:56

Re: Bereiche festlegen
 
Zitat:

Sonst deklariert man ja zweimal eine Variable mit gleichem Bezeichner. Da kommt meist eine Fehlermeldung wie "Identifier redeclared" oder so ähnlich.
Ist es dir nicht aufgefallen, dass das ein Schreibfehler sein könnte. :gruebel: Es kommt nämlich vor.

Remake 4. Mär 2005 17:04

Re: Bereiche festlegen
 
Also gut.
Die Koordinaten geben also die Position der oberen linken und der unteren rechten Ecke an.
Das hättet ihr mich auch leichter sagen können ;)
Egal, jetzt weiß ichs ja. Aber den Sinn verstehe ich nicht ganz. Breite und Höhe fände ich praktischer..

Also danke für die Hilfe.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:49 Uhr.
Seite 1 von 2  1 2      

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