![]() |
Welcher Cursor ist gerade aktiv
Ergänzung zum Thema
![]() Wie kann ich feststellen welcher cursor beim MouseMove Ereignis sichtbar ist. wenn ich eine Form verschieben will. horizontal, vertikal und NS. Ich möchte diese anhand eines Integer auswerten. 7 wäre vertikal(resizeCursor) 9 horizontal(resizeCursor) 8 NS(resizeCursor) diese werte stehen für den ausgewählten cursor in einem control 0 wäre dann der standard cursor (VB) hoffe ihr versteht was ich meine. Mein Ansatz
Delphi-Quellcode:
gruss
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls; type TForm1 = class(TForm) Image1 : TImage; Label1 : TLabel; procedure Image1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); private { Private declarations } FCursor : TCursor; procedure SetCursor(Value: TCursor); public { Public declarations } function GetCursor: TCursor; property Cursor: TCursor read FCursor write SetCursor; end; var Form1: TForm1; implementation {$R *.dfm} procedure ControlMouseMove(aCtrl : TObject; Button : TMouseButton; Shift : TShiftState; X : Integer; Y : Integer); begin if Button = mbLeft then end; procedure TForm1.SetCursor(Value: TCursor); begin FCursor := Value; end; procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin FCursor := 0; end; function TForm1.GetCursor; begin Result := FCursor; end; procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); Var Button : TMouseButton; begin ControlMouseMove(Image1, Button, Shift, X, Y) end; procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin FCursor := 0; end; end. |
Re: Welcher Cursor ist gerade aktiv
Hallo Emil,
den aktuell verwendeten Cursor solltest du jederzeit in Screen.Cursor finden - wenn ich mich nicht täusche. Freundliche Grüße |
Re: Welcher Cursor ist gerade aktiv
Zitat:
Um was es mir geht bei dieser frage. Ich möchte ein resize verhalten ala Winamp verwirklichen ohne extrem viele coordinaten abzufragen. Meine Idee ist das über die abfrage des aktuell initialisierten cursor zu erreichen. Dann benötige ich keine zusätzlichen coordinaten wo sich die Maus zur zeit befindet. Ein Beispiel in VB habe ich schon geschrieben und es funktioniert mit ein paar zeilen. Nur meine umsetzung von Vb nach Delphi macht wieder probleme.
Delphi-Quellcode:
gruss Emil
Option Explicit
Private Sub ControlMouseMove(aCtrl As Object, Button As Integer, Shift As Integer, X As Single, Y As Single) Dim iTwipX, iTwipY Dim iScale As Integer On Error Resume Next iScale = aCtrl.ScaleMode iTwipX = Screen.TwipsPerPixelX iTwipY = Screen.TwipsPerPixelY aCtrl.ScaleMode = 3 If Button = vbLeftButton Then If MP = 0 Then GoTo Fix_Scale If MP = 7 Then GoTo NS_Resize If X / iTwipX > aCtrl.ScaleWidth + iTwipX Then aCtrl.Width = aCtrl.Width + iTwipX ^ 2 * 2 ElseIf X / iTwipX < aCtrl.ScaleWidth - iTwipX Then aCtrl.Width = aCtrl.Width - iTwipX ^ 2 * 2 End If Form1.Width = aCtrl.Left + aCtrl.Width aCtrl.Left = Form1.Width - 255 If MP = 9 Then GoTo Fix_Scale NS_Resize: If Y / iTwipY > aCtrl.ScaleHeight + iTwipY Then aCtrl.Height = aCtrl.Height + iTwipY ^ 2 * 2 ElseIf Y / iTwipY < aCtrl.ScaleHeight - iTwipY Then aCtrl.Height = aCtrl.Height - iTwipY ^ 2 * 2 End If Form1.Height = aCtrl.Top + aCtrl.Height aCtrl.Top = Form1.Height - 255 Else If X / iTwipX > aCtrl.ScaleWidth - 12 _ And Y / iTwipY > aCtrl.ScaleHeight - 10 Then MP = 8 ElseIf X / iTwipX > aCtrl.ScaleWidth - 12 _ And Y / iTwipY < aCtrl.ScaleHeight - 10 Then MP = 9 ElseIf X / iTwipX < aCtrl.ScaleWidth - 12 _ And Y / iTwipY > aCtrl.ScaleHeight - 10 Then MP = 7 Else MP = 0 End If End If Label1.Caption = CStr(MP) Fix_Scale: aCtrl.ScaleMode = iScale% End Sub Private Sub Form_DblClick() Unload Me End Sub Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) MP = 0 End Sub Private Property Let MP(aMPVal As Integer) Me.MousePointer = aMPVal End Property Private Property Get MP() As Integer MP = Me.MousePointer End Property Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) Call ControlMouseMove(Picture1, Button, Shift, X, Y) End Sub Private Sub Picture1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) MP = 0 End Sub |
Re: Welcher Cursor ist gerade aktiv
So viel wenig Zeilen sind das ja auch nun nicht. ;)
Guck mal hier: ![]() Sir Gummibärchen (SirThornberry ) hatte da auch mal etwas geposted, find es aber im Moment nicht... |
Re: Welcher Cursor ist gerade aktiv
Zitat:
|
Re: Welcher Cursor ist gerade aktiv
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Das ist "lediglich" ein resitz einer Borderlosen Form diese wird nicht Schrittweise in der größe verändert. Um das zu realisieren wird auf dieser art einiges mehr an Code abverlangt vorallem dann wenn du auch noch einen Skin auf der Oberfläsche ala Winamp hast. Mein Code hat eine PicBox welche als Greifer dient so kann man alle anderen Border außeracht lassen und muss sich darum nicht kümmern. EDIT: Im Anhang mal ein kleines Beispiel Allerdings habe ich dort noch das Problem wenn die Form vergrößert wurde dieses wieder zu verkleinern Doppelclick auf die Form beendet die EXE wieder. gruss Emil |
Re: Welcher Cursor ist gerade aktiv
Zitat:
Aber nicht nur der Rahmen sondern die ganze Form. @turboPASCAL Noch was. Wenn du einen Skin verwendest und diesen nicht selbst auf die Form zeichnest sondern dafür Controls PicBox, Image oder sonst was verwendest kannst du die Form selber gar nciht mehr bedienen in dem Fall wäre der verlinkte Code quasi Tod ohne funktion. gruss Emil |
Re: Welcher Cursor ist gerade aktiv
Liste der Anhänge anzeigen (Anzahl: 2)
Hi
Hier nun mal meine selbstgebastelte Methode eine Form so in der größe zu verändern wie Winamp es tut. 1. Problem .. TImage kann man nicht verwenden da dieses kein reales THandle besitzt. Ka was man damit überhaupt machen kann.. ;) eigentlich sinnlos das Teil. Habe deshalb picFormResize mit einem Panel ersetzt nur mal so zum testen. 2. Der Code ist nicht so schön klein wie der ursprüngliche den ich verwenden wollte. Damit kann man aber so wie ich festgestellt habe das Resitz verhalten ala Winamp nicht verwirklichen wenn Skins auf der Oberfläsche sind. Deshalb das neue hier. Testen kann man das mit Gen_Bitmap hier im Forum einfach die Funktionen ersetzen.
Delphi-Quellcode:
gruss Emil
Var
mRightStep : Integer = 25; mHeightStep : Integer = 29; mDrag : boolean; procedure Tfrm_Gen.picFormResizeMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin If ssLeft in Shift Then mDrag := True end; procedure Tfrm_Gen.picFormResizeMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); Var L : Integer; //Form links T : Integer; //Form Top W : Integer; //form weite H : Integer; //Form Höhe mPBRec : TRECT; //Record der PicBox POINT : TPOINT; //Maus Position begin L := self.left; T := self.top; W := self.Width; H := self.Height; //MouseDown ereignis ausgelößt? If mDrag = True Then begin //Aktuelle Position der PictureBox ermitteln GetWindowRect(picFormResize.Handle, mPBRec); //Aktuelle Cursor Position ermitteln GetCursorPos(POINT); //******* Form Schrittweise Diagonal nach unten rechts verschieben abhängig von der Cursor Position ******* If (POINT.x >= mPBRec.Right - 5) And (POINT.y >= mPBRec.Bottom - 5) Then begin self.left := L; self.top := T; self.Width := W + mRightStep; self.Height := H + mHeightStep; //Neue Position der PictureBox ermitteln. Alte wurde verändert GetWindowRect(picFormResize.Handle, mPBRec); //Cursor Position setzen auf die mitte der PicBox //damit nicht die nächste abfrage ausgelößt wird SetCursorPos(mPBRec.Left + ((mPBRec.Right - mPBRec.Left) div 2) - 3, mPBRec.Top + ((mPBRec.Bottom - mPBRec.Top) div 2) - 3 ); //Raus hier exit; end; //******* Form Schrittweise Diagonal nach oben links verschieben abhängig von der Cursor Position ******* If (POINT.x <= mPBRec.left) And (POINT.y <= mPBRec.top) Then begin //Standard weite erzwingen wenn Formweite unter 4125 If w < 275 Then w := 275; //Standard höhe erzwingen wenn Formhöhe unter 1740 If h < 116 Then h := 116; self.left := L; self.top := T; self.Width := W - mRightStep; self.Height := H - mHeightStep; //Neue Position der PictureBox ermitteln. Alte wurde verändert GetWindowRect(picFormResize.Handle, mPBRec); //Cursor Position setzen auf die mitte der PicBox //damit nicht die nächste abfrage ausgelößt wird SetCursorPos( mPBRec.left + ((mPBRec.Right - mPBRec.left) div 2) - 3, mPBRec.Top + ((mPBRec.Bottom - mPBRec.Top) div 2) - 3); //Raus hier exit; end; //******* Form Schrittweise nach Rechts verschieben abhängig von der Cursor Position ******* If (POINT.x >= (mPBRec.left + (mPBRec.Right - mPBRec.left))) Then begin self.left := L; self.top := T; self.Width := W + mRightStep; self.Height := H; //Neue Position der PictureBox ermitteln. Alte wurde verändert GetWindowRect(picFormResize.Handle, mPBRec); //Cursor Position setzen auf die mitte der PicBox //damit nicht die nächste abfrage ausgelößt wird SetCursorPos( mPBRec.left + ((mPBRec.Right - mPBRec.left) div 2) - 3, mPBRec.Top + ((mPBRec.Bottom - mPBRec.Top) div 2) - 3); //******* Form Schrittweise nach Unten verschieben abhängig von der Cursor Position ******* end else If (POINT.y >= (mPBRec.tOp + (mPBRec.Bottom - mPBRec.tOp))) Then begin self.left := L; self.top := T; self.Width := W; self.Height := H + mHeightStep; //Neue Position der PictureBox ermitteln. Alte wurde verändert GetWindowRect(picFormResize.Handle, mPBRec); //Cursor Position setzen auf die mitte der PicBox //damit nicht die nächste abfrage ausgelößt wird SetCursorPos(mPBRec.left + ((mPBRec.Right - mPBRec.left) div 2) - 3, mPBRec.Top + ((mPBRec.Bottom - mPBRec.Top) div 2) - 3); //******* Form Schrittweise nach Links verschieben abhängig von der Cursor Position ******* end else If (POINT.x <= (mPBRec.Right + (mPBRec.left - mPBRec.Right) - 6)) Then begin //Standard weite erzwingen wenn Formweite unter 4125 If w < 275 Then w := 275; self.left := L; self.top := T; self.Width := W - mRightStep; self.Height := H; //Neue Position der PictureBox ermitteln. Alte wurde verändert GetWindowRect(picFormResize.Handle, mPBRec); //Cursor Position setzen auf die mitte der PicBox //damit nicht die nächste abfrage ausgelößt wird SetCursorPos(mPBRec.left + ((mPBRec.Right - mPBRec.left) div 2) - 3, mPBRec.Top + ((mPBRec.Bottom - mPBRec.Top) div 2) - 3); //******* Form Schrittweise nach Oben verschieben abhängig von der Cursor Position ******* end else If (POINT.y <= (mPBRec.Bottom + (mPBRec.Top - mPBRec.Bottom)) - 6) Then begin //Standard höhe erzwingen wenn Formhöhe unter 1740 If h < 116 Then h := 116; self.left := L; self.top := T; self.Width := W ; self.Height := H - mHeightStep; //Neue Position der PictureBox ermitteln. Alte wurde verändert GetWindowRect(picFormResize.Handle, mPBRec); //Cursor Position setzen auf die mitte der PicBox //damit nicht die nächste abfrage ausgelößt wird SetCursorPos(mPBRec.left + ((mPBRec.Right - mPBRec.left) div 2) - 3, mPBRec.Top + ((mPBRec.Bottom - mPBRec.Top) div 2) - 3); end; end; end; procedure Tfrm_Gen.picFormResizeMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin If mDrag Then mDrag := False; end; |
Re: Welcher Cursor ist gerade aktiv
Würde es nicht reichen, im OnMouseMove (wenn die Form vergrößert wird) einfach das hier zu machen:
Delphi-Quellcode:
Also, sinngemäß, denn natürlich brauchst Du noch die Fallunterscheidung: Nur Breite ändern, Nur Höhe ändern, Beides etc.
Width := 10 * ((Mouse.X-Left) Div 10);
Height:= 10 * ((Mouse.Y-Top) Div 10); |
Re: Welcher Cursor ist gerade aktiv
Zitat:
Ich hab das schon ausgetüftelt und meine ;) das dies der beste weg ist. Ohne die kontrolle über die Maus hat man da keine Chance das halbwegs vernünftig hinzubekommen. Was machst du mit den 10 ? 10 gibt es nicht die höhe und weite ist unterschiedlich beim verschieben. Einmal 25 für die weite und 29 für die höhe. gruss Emil |
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 05:44 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz