Announcement

Collapse
No announcement yet.

Anwendung ohne Titelzeile verschieben

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

  • Anwendung ohne Titelzeile verschieben

    Wie kann ich ein fenster ohne Titelzeile verschieben ?

  • #2
    Andreas Kosch hat das in seinem Buch WIN32 Lösungen sehr gut beschrieben. Sehr empfehlenswertes Buch!

    procedure WMNCHitTest(var M: TWMNCHitTest); message WM_NCHitTest;
    var
    rScreenPos : TPoint; //Desktop-Koordinaten von Windows
    rClientPos : TPoint; //Fenstern-Koordinaten des Formulares
    begin
    inherited;
    if M.Result = htClient then
    begin
    rScreenPos.x := M.XPos;
    rScreenPos.y := M.XPoy;
    rClientPos := ScreenToClient(rScreenPos);
    if (rClientPos.y < 30) then
    M.Result := htCaption;
    end;
    end;

    Windows wird also einfach vorgegaukelt, dass sich die Maus in einer Fenster-Titelzeile befindet, den Rest übernimmt dann Windows

    Comment


    • #3
      Sorry, das Gleich nochmal formatiert:<p>

      procedure WMNCHitTest(var M: TWMNCHitTest); message WM_NCHitTest;<br> var rScreenPos : TPoint; //Desktop-Koordinaten von Windows <br> rClientPos : TPoint; //Fenstern-Koordinaten des Formulares<br> begin<br> inherited;<br> if M.Result = htClient then<br> begin<br> rScreenPos.x := M.XPos;<br> rScreenPos.y := M.XPos;<br> rClientPos := ScreenToClient(rScreenPos);<br> if (rClientPos.y < 30) then<br> M.Result := htCaption;<br> end;<br> end;<p&gt

      Comment


      • #4
        Hallöchen,
        das da oben ist mir zu kompliziert. Ich habe in die OnMouseMove-Ereignisbehandlungsroutine eines Panels folgenden Code eingefügt, nachdem ich erstmal zwei globale Variablen xf,yf:=Integer deklariert habe:

        var P:TPoint;
        begin
        P.x:=x; // x-Koordinate...
        P.y:=y; // ... und y-Koordinate in einem TPoint- // Record speichern...
        P:=ClientToScreen(P); // und in globale Koordinaten umwandeln

        if Shift=[ssleft] then //wenn linke Maustaste grdrückt, dann...
        begin
        Form1.Left:=P.x-(xf); //Linken Rand des Formulars auf (aktuelle Zeigerposition)- (Position des Mausklicks innerhalb des Panels) setzen
        Form1.Top:= P.y-(yf); //Beim oberen Rand dasselbe machen...
        end; //das war's!
        end;

        In der OnMouseDown-Behandlung habe ich dann noch die aktuelle Klickposition gespeichert:

        //...
        xf:=X;
        yf:=Y;
        //...

        Viel Erfolg,
        Leonhardt(15

        Comment


        • #5
          Hallo Leonhardt,

          dein Beispiel funktioniert natürlich, aber es bildet nicht den Windows-Standard für das Verschieben von Fenstern ab. Da wird nämlich standardmäßig der Fensterinhalt beim Verschieben nicht angezeigt. Wenn du das auch noch einbauen willst, ist die obige Lösung doch einfacher.

          Gruß, Uli(45

          Comment


          • #6
            Hi

            Eine andere Möglichkeit:

            <pre>

            uses Windows, Messages, etc....

            procedure TForm1.XYZSonstwasPanelMouseDown();
            begin
            if Button = mbLeft then
            begin
            SetCaptureControl(nil);
            Perform(wm_SysCommand, sc_Move or 1, 0);
            end;
            end;

            </pre>

            Dies wird beiden obigen Lösungen gerecht.

            Gruß Hage

            Comment


            • #7
              Hallo Hagen,

              Gratulation, das funktioniert perfekt und ist wirklich übersichtlich!

              Gruß Ul

              Comment


              • #8
                Ehrlich währt am längsten:

                Wenn es auch verjährt ist - ich möchte trotzdem darauf hinweisen!
                Die Schummelei des Herrn Kosch zahlt sich nicht aus, wenn das Fenster größer als der Screen ist. Es läßt sich nicht - dauerhaft - beliebig verschieben. Windows will offenbar jedesmal die - nicht vorhandene - Titelzeile wieder ins Blickfeld rücken. Bei der "ehrlichen" Lösung des Leonhardt Wille gibt es da keine Probleme.

                Falko Knittel

                Comment


                • #9
                  Haste mal die Lösung mit wm_SysCommand probiert

                  Comment

                  Working...
                  X