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:
Aber hier mal ein Beispiel, wie ich das eigentlich dachte.
Delphi-Quellcode:
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
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. |
Re: Welcher Cursor ist gerade aktiv
@alzaimar
Zitat:
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 |
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 |
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 |
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. |
Re: Welcher Cursor ist gerade aktiv
Zitat:
Werde mir das in ruhe anschaun. Gruss Emil |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:24 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