Drag & Drop / Komponente verschieben: Nur horizontal



  • Hallo!

    Ich habe ein 3 Pixel breites Panel, welches ich ählich wie einen "TSplitter" einsetzen möchte.
    Das Panel soll also nur horizontal verschoben werden können, also nur nach links oder rechts, auf keinen Fall nach oben oder unten.
    Im OnMouseDown-Ereignis habe ich jetzt schon das hier drin:

    RECT Rec;
      Rec.left = 0;
      Rec.top = Mouse->CursorPos.y;
      Rec.right = Screen->Width;
      Rec.bottom = Mouse->CursorPos.y;
      ClipCursor(&Rec);
      ReleaseCapture();
      SendMessage(Panel1->Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0);
      ClipCursor(NULL);
    

    Der Code funktioniert allerdings nicht. Es sieht so aus, als würde die SendMessage die vorherige Funktion ClipCursor wieder aufheben.

    Hat jemand ne Idee, wie ich das lösen könnte? Ich möchte das Panel nur nach links oder rechts verschieben können...

    tschüss
    Robert



  • Machs doch manuell: Du merkst dir bei OnMouseDown die Startposition (jetziger Panel->Left Wert)(eventuell unter Panel->Tag). Dann aktualisierst du bei OnMouseMove den Left-Wert um den gleichen Wert, um den sich die Mausposition bezüglich dem Startpunkt geändert hat... jedoch nur, wenn in Panel->Tag auch was drin steht. Wenn die Maus wieder losgelassen wird, sollte man deshalb Tag wieder auf 0 setzten.



  • Hallo Plemplem!

    Erstmal danke für deine Antwort!

    Über diesen Lösungsweg habe ich mir auch bereits Gedanken gemacht, ich glaube aber nicht, dass das so funktionieren wird.
    Das Problem ist, dass mein Panel nur 3 Pixel breit ist. Wenn ich nun auf dem äußersten Pixel rechts anpacke und dann nach rechts ziehe tritt kein OnMouseMove - Ereignis mehr ein, weil die Maus dann ja das Panel verlässt.
    Und über dem Umweg vom OnMouseMove - Ereignis des übergeordneten Forms möchte ich nicht gehen... (weil ichs evtl. später mal in ne Komponente basteln möchte)

    tschüss
    Robert



  • Ist zwar schon etwas alt, aber trotzdem: Hast Du noch eine Lösung gefunden? - Ich stehe genau vor dem gleichen Problem!!

    Vielen Dank!

    - Adrian



  • SetCapture?



  • Hallo,

    nicht wirklich. Hatte es über OnMouseDown, OnMouseMove und OnMouseUp gemacht, also bei OnMouseDown ne Variable auf true und nen TPoint gesetzt, bei OnMouseUp die Variable wieder auf false.
    Und in OnMouseMove habe ich dann geguckt, ob die Variable true ist, wenn ja soll das Ding verschoben werden.

    Also eigentlich der Lösungsweg von Plemplem, habe das Panel auch größer gemacht als nur die 3 Pixel...

    tschüss
    Robert



  • Gibt es keine Möglichkeit, wenn man im OnMouseDown Ereignis des Panels folgenden Code hat

    Panel->Perform(WM_LBUTTONUP,0,0);
        Panel->Perform(WM_SYSCOMMAND, SC_MOVE + 2, 0);
    

    dann den Positionierungsvorgang zu steuern? - Das Verschieben ansich funktioniert ja schon prächtig...

    - Adrian


Anmelden zum Antworten