Announcement

Collapse
No announcement yet.

TForm bewegen durch draggen von TImage

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • TForm bewegen durch draggen von TImage

    Hoi ho!

    Ich habe eine Form in der ich durch ein TImage ein Bild eingefügt habe.
    Wie kann ich nun die Form draggen, wenn ich am Bild ziehe, praktisch als
    Ersatzt für diese obere Zeile, wo auch der Name des Programms steht.
    (die Bezeichnung ist mir leider entfallen.. )

  • #2
    Hallo,

    immer dann, wenn die Maus angeklickt wird, fragt Windows über die Botschaft <b>WM_NCHitTest</b> (<i>Windows message non-client hit test</i>) beim Fenster nach, welcher Bereich dort angeklickt wurde. Wenn das eigene Programm hier die Konstante <b>htCaption</b> zurückliefert, "denkt" Windows, das die Fensterzeile angeklickt wurde und verschiebt daher das Fenster in eigener Regie.

    Das könnte zum Beispiel so aussehen:
    <pre>
    type
    TForm1 = class(TForm)
    ...
    procedure WMNCHitTest(var M: TWMNCHitTest); message WM_NCHitTest;
    ...
    <pre>

    <pre>
    (* Problem: Ein Fenster ohne Titelzeile und ohne Systemmenü
    kann nicht verschoben werden. Daher muß das Programm
    "von Hand" nachhelfen, indem Windows beschummelt
    wird. Immer dann, wenn sich der Mauszeiger am oberen
    Fensterrand befindet, täuscht das Programm die Fensterzeile vor. *)

    procedure TFormRound.WMNCHitTest(var M: TWMNCHitTest);
    var
    rScreenPos : TPoint; // Desktop-Koordinaten von Windows
    rClientPos : TPoint; // Fenster-Koordinaten des Formulars
    begin
    // Standardbehandlung aufrufen -> Record »M« wird gefüllt
    inherited;
    // Client-Bereich des Fensters (Formular) angeklickt ?
    if M.Result = htClient then
    begin
    // Koordinaten bezogen auf den Desktop auslesen
    rScreenPos.X := M.XPos;
    rScreenPos.Y := M.YPos;
    // Koordinaten relativ zum Formular (Fenster) umrechnen
    rClientPos := ScreenToClient(rScreenPos);
    // befindet sich die Maus am oberen Fensterrand ?
    if (rClientPos.Y < 30) then
    // Windows beschummeln -> Fenstertitelzeile simulieren
    M.Result := htCaption;
    end;
    end;
    </pre&gt

    Comment


    • #3
      Ich bedanke mich recht herzlich.
      es funktioniert einwandfrei.

      Danke und Tschüss..

      Stepha

      Comment


      • #4
        Ist es denn eigentlich dann noch möglich den cursor zu ändern, oder
        einen hint in diesem bereich anzuzeigen?

        Ich habe es mit einem TImage versucht und die Cursor-Eigenschaft auf
        crSizeAll gesetzt, doch es hatte keine Auswirkung.
        Ebenfalls wurde der Hint nicht angezeigt.

        Daraufhin hab ich deinen Code zu follgendem geändert:
        <br>
        ...<br>
        if (rClientPos.Y < 30) then <br>
        begin<br>
        Screen.Cursor := crSizeAll;<br>
        // Windows beschummeln -> Fenstertitelzeile simulieren <br>
        M.Result := htCaption; <br>
        end;<br>
        ...<br>
        <br>
        Doch auch dies half nichts.

        Ist es dennoch möglich

        Comment

        Working...
        X