Einzelnen Beitrag anzeigen

alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#11

Re: Welcher Cursor ist gerade aktiv

  Alt 21. Jun 2007, 09:33
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 von EWeiss:
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

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
Angehängte Dateien
Dateityp: rar movablesizableform_103.rar (167,4 KB, 7x aufgerufen)
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat