![]() |
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 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:52 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 by Thomas Breitkreuz