Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Welcher Cursor ist gerade aktiv (https://www.delphipraxis.net/94245-welcher-cursor-ist-gerade-aktiv.html)

alzaimar 21. Jun 2007 09:33

Re: Welcher Cursor ist gerade aktiv
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi Emil,

Ach, es war nur sehr früh heute und irgendwo meinte ich, 10 pixel gesehen zu haben. Ist ja auch egal, jedenfalls ist 10 die Granularität, mit der die Größe in X- bzw. Y-Richtung verändert werden soll.
Zitat:

Zitat von EWeiss
Zitat:

Zitat von alzaimar
Würde es nicht reichen, im OnMouseMove (wenn die Form vergrößert wird) einfach das hier zu machen:

Delphi-Quellcode:
  Width := 10 * ((Mouse.X-Left) Div 10);
  Height:= 10 * ((Mouse.Y-Top) Div 10);
A...

Weiss jetzt nicht genau was du meinst und an welcher stelle....

Ich auch nicht :oops:

Aber hier mal ein Beispiel, wie ich das eigentlich dachte.
Delphi-Quellcode:
Unit Unit1;

Interface

Uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

Type
  THitTest = (htMove, htSizeGrip, htNone);

  TForm1 = Class(TForm)
    Shape: TShape;
    lbInfo: TLabel;
    Procedure ShapeMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    Procedure ShapeMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    Procedure ShapeMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    Procedure FormCreate(Sender: TObject);
  private
    fDragHitTest: THitTest;
    fDragStartX, fDragStartY: Integer;
    Function GetHitTest(aPt: TPoint): THitTest;
  End;

Var
  Form1: TForm1;

Implementation

{$R *.dfm}

Const
  ccGap = 4;                           // Hot Zone Rahmen
  ccHorzGranulation = 21;
  ccVertGranulation = 29;

Function TForm1.GetHitTest(aPt: TPoint): THitTest;
  Function Between(a, b, c: Integer): Boolean; // True, wenn a zwischen b und c liegt
  Begin
    Result := (a >= b) And (a <= c)
  End;

Begin
// untere rechte Ecke (Kann man natürlich besser definieren)
  If Between(aPt.X, Width - ccGap + 1, Width) And Between(aPt.Y, Height - ccGap + 1, Height) Then
    Result := htSizeGrip
// Sonst irgendwo am Rand (geht auch besser)
  Else If Between(aPt.X, 0, ccGap) Or Between(aPt.X, Width - ccGap + 1, Width)
    Or Between(aPt.Y, 0, ccGap) Or Between(aPt.Y, Height - ccGap + 1, Height) Then
    Result := htMove
  Else
    Result := htNone
End;

Procedure TForm1.ShapeMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y:
  Integer);
Begin
  fDragHitTest := GetHitTest(Point(X, Y));
  fDragStartX := X;
  fDragStartY := Y;
End;

Procedure TForm1.ShapeMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
Var
  P: TPoint;
Begin
  P := ClientToScreen(Point(X, Y));
  Case fDragHitTest Of
    htMove: Begin
        Left := P.X - fDragStartX;
        Top := P.Y - fDragStartY;
      End;
    htSizeGrip: Begin
        Width := (1 + X Div ccVertGranulation) * ccVertGranulation; // Hier, das meinte ich in
        Height := (1 + Y Div ccHorzGranulation) * ccHorzGranulation; // meiner Schlaftrunkenheit
      End;
  End;
End;

Procedure TForm1.ShapeMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
Begin
  fDragHitTest := htNone;
End;

Procedure TForm1.FormCreate(Sender: TObject);
Begin
  fDragHitTest := htNone;
  Shape.Pen.Width := ccGap;
End;

End.
Das simuliert in etwa WinAmp. Man muss aber unten rechts sehr genau zielen, damit man den kleinen 4x4pxl großen Bereich trifft, der die Größe verändert.. das kann man bestimmt besser machen

EWeiss 21. Jun 2007 16:38

Re: Welcher Cursor ist gerade aktiv
 
@alzaimar

Zitat:

Das simuliert in etwa WinAmp.
Man muss aber unten rechts sehr genau zielen, damit man den kleinen 4x4pxl großen Bereich trifft, der die Größe verändert.. das kann man bestimmt besser machen
Ja nicht schlecht ;)
Hmm mußte aber wie du schon sagtest eine Lupe nehme um da etwas zu treffen.

Hätte mein teil auch in eine Klasse packen können.
Aber letztendlich kommt es darauf an das es funktioniert.

Das geht bei meinen Source eigentlich sehr gut.
Aber als ansatz wie man es besser machen könnte ist dein Beispiel nicht schlecht.

EDIT:
Dafür gibt es ja den Greifer als PicResize damit man nicht nach 4x4 suchen muss.

gruss Emil

EWeiss 21. Jun 2007 19:33

Re: Welcher Cursor ist gerade aktiv
 
@alzaimar

Habe deine variante nochmal genau analysiert.
Definitiv geht es so nicht wenn du unten in der Ecke einen Skin(PicBox, panel) oder
was auch immer einfügst und diesen als Greifer zum vergrößern der Form verwendest.

Wie würdest du das machen das es funktioniert?
Ansonsten ist der Code schön klein. ;)

gruss Emil

EWeiss 22. Jun 2007 16:56

Re: Welcher Cursor ist gerade aktiv
 
Hätte immer noch interesse an einer optimierten Variante meines Schnipsel
Die muss aber funktionstüchtig sein mit aufgesetzer PicBox.


gruss Emil

alzaimar 22. Jun 2007 17:55

Re: Welcher Cursor ist gerade aktiv
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi Emil

eigentlich ganz einfach. Auch ein TImage hat OnMouseXXXXX-Ereignisse. Du musst dann meinen Code nur etwas modifizieren, sodaß die Mauskoordinaten immer relativ zur Form sind. Das geht mit ClientToScreen und ScreenToClient recht einfach.

Dann würde alle ShapeMouse-Ereignisse auch dem Size Grip Image zuweisen.

Zum Schluss prüfe ich im OnMouseDown-Ereignis, ob der Sender zufällig das Sizegrip-Image ist (über den Komponenten-Namen). Wenn ja, dann spare ich mir die Prüfung, ob die Maus am Rand ist.

Prinzipiell kannst Du mit allen Gadgets (sprich: Images) so verfahren. Ich würde, glaube ich, nur eine zentrale Mausauswerte routine schreiben. Dann ist alles zentral und es ist übersichtlicher.

EWeiss 22. Jun 2007 18:22

Re: Welcher Cursor ist gerade aktiv
 
Zitat:

Zitat von alzaimar
Hi Emil

eigentlich ganz einfach. Auch ein TImage hat OnMouseXXXXX-Ereignisse. Du musst dann meinen Code nur etwas modifizieren, sodaß die Mauskoordinaten immer relativ zur Form sind. Das geht mit ClientToScreen und ScreenToClient recht einfach.

Dann würde alle ShapeMouse-Ereignisse auch dem Size Grip Image zuweisen.

Zum Schluss prüfe ich im OnMouseDown-Ereignis, ob der Sender zufällig das Sizegrip-Image ist (über den Komponenten-Namen). Wenn ja, dann spare ich mir die Prüfung, ob die Maus am Rand ist.

Prinzipiell kannst Du mit allen Gadgets (sprich: Images) so verfahren. Ich würde, glaube ich, nur eine zentrale Mausauswerte routine schreiben. Dann ist alles zentral und es ist übersichtlicher.

Danke für deine mühe ;)
Werde mir das in ruhe anschaun.

Gruss Emil


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:24 Uhr.
Seite 2 von 2     12   

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