AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Welcher Cursor ist gerade aktiv

Ein Thema von EWeiss · begonnen am 18. Jun 2007 · letzter Beitrag vom 22. Jun 2007
Antwort Antwort
Seite 1 von 2  1 2      
EWeiss
(Gast)

n/a Beiträge
 
#1

Welcher Cursor ist gerade aktiv

  Alt 18. Jun 2007, 19:00
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
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: Welcher Cursor ist gerade aktiv

  Alt 18. Jun 2007, 19:16
Hallo Emil,

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

Freundliche Grüße
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

Re: Welcher Cursor ist gerade aktiv

  Alt 18. Jun 2007, 19:22
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
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#4

Re: Welcher Cursor ist gerade aktiv

  Alt 18. Jun 2007, 21:30
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...
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Welcher Cursor ist gerade aktiv

  Alt 18. Jun 2007, 22:21
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?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

Re: Welcher Cursor ist gerade aktiv

  Alt 18. Jun 2007, 22:26
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
Angehängte Dateien
Dateityp: zip resize_102.zip (6,8 KB, 3x aufgerufen)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#7

Re: Welcher Cursor ist gerade aktiv

  Alt 18. Jun 2007, 22:43
Zitat von Luckie:
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
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#8

Re: Welcher Cursor ist gerade aktiv

  Alt 21. Jun 2007, 04:14
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
Miniaturansicht angehängter Grafiken
fertig_954.jpg  
Angehängte Dateien
Dateityp: zip gen_delphi_643.zip (287,8 KB, 4x aufgerufen)
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

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

Re: Welcher Cursor ist gerade aktiv

  Alt 21. Jun 2007, 06:27
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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#10

Re: Welcher Cursor ist gerade aktiv

  Alt 21. Jun 2007, 06:42
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:39 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