Delphi-PRAXiS
Seite 1 von 2  1 2      

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)

EWeiss 18. Jun 2007 18:00


Welcher Cursor ist gerade aktiv
 
Ergänzung zum Thema http://www.delphipraxis.net/internal...=738631#738631

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:
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.
gruss

marabu 18. Jun 2007 18:16

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

EWeiss 18. Jun 2007 18:22

Re: Welcher Cursor ist gerade aktiv
 
Zitat:

Zitat von marabu
Hallo Emil,

den aktuell verwendeten Cursor solltest du jederzeit in Screen.Cursor finden - wenn ich mich nicht täusche.

Freundliche Grüße

Werde es mal testen.
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:
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
gruss Emil

turboPASCAL 18. Jun 2007 20:30

Re: Welcher Cursor ist gerade aktiv
 
So viel wenig Zeilen sind das ja auch nun nicht. ;)

Guck mal hier:
http://www.delphipraxis.net/internal...=674328#674328

Sir Gummibärchen (SirThornberry ) hatte da auch mal etwas geposted, find es aber im Moment nicht...

Luckie 18. Jun 2007 21:21

Re: Welcher Cursor ist gerade aktiv
 
Zitat:

Zitat von EWeiss
Ich möchte ein resize verhalten ala Winamp verwirklichen

Ich kenne Winamp nicht. Wie verhält es sich denn beim Größe ändern?

EWeiss 18. Jun 2007 21:26

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

Zitat von turboPASCAL
So viel wenig Zeilen sind das ja auch nun nicht. ;)

Guck mal hier:
http://www.delphipraxis.net/internal...=674328#674328

Sir Gummibärchen (SirThornberry ) hatte da auch mal etwas geposted, find es aber im Moment nicht...

Ja nur !!!
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

EWeiss 18. Jun 2007 21:43

Re: Welcher Cursor ist gerade aktiv
 
Zitat:

Zitat von Luckie
Zitat:

Zitat von EWeiss
Ich möchte ein resize verhalten ala Winamp verwirklichen

Ich kenne Winamp nicht. Wie verhält es sich denn beim Größe ändern?

Wie oben beschrieben diese wird schrittweise um 10Pixel in der größe verändert.
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

EWeiss 21. Jun 2007 03:14

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:
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;
gruss Emil

alzaimar 21. Jun 2007 05:27

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:
  Width := 10 * ((Mouse.X-Left) Div 10);
  Height:= 10 * ((Mouse.Y-Top) Div 10);
Also, sinngemäß, denn natürlich brauchst Du noch die Fallunterscheidung: Nur Breite ändern, Nur Höhe ändern, Beides etc.

EWeiss 21. Jun 2007 05:42

Re: Welcher Cursor ist gerade aktiv
 
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);
Also, sinngemäß, denn natürlich brauchst Du noch die Fallunterscheidung: Nur Breite ändern, Nur Höhe ändern, Beides etc.

Weiss jetzt nicht genau was du meinst und an welcher stelle.
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 22:09 Uhr.
Seite 1 von 2  1 2      

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