[Gelöst] TForm Resize ohne Rahmen



  • Hallo,

    ich habe nach langer Zeit mal wieder den C++ Builder 6 ausgegraben, den ich noch herum liegen hatte. Und ich habe jetzt folgende Herausforderung:

    Ich möchte eine TForm vergrößern / verkleinern, allerdings ohne Rahmen. (Die Form wird selbst gestaltet, mit Bildern).

    Was ich bisher schon einmal habe, um einen 1px breiten "virtuellen" Rahmen zu definieren und den Mauszeiger entsprechend ändern zu lassen:

    void __fastcall TfMain::FormMouseMove(TObject *Sender, TShiftState Shift,
          int X, int Y)
    {
            if((X<1 && Y<9) || (X<9 && Y<1) || (X>ClientWidth-10 && Y>=ClientHeight-1) || (X>=ClientWidth-1 && Y>ClientHeight-10))
            {
                    Cursor=crSizeNWSE;
            }
            else if((X<9 && Y>=ClientHeight-1) || (X<1 && Y>ClientHeight-10) || (X>ClientWidth-10 && Y<1) || (X>=ClientWidth-1 && Y<9))
            {
                    Cursor=crSizeNESW;
            }
            else if(X<1 || X>=ClientWidth-1)
            {
                    Cursor=crSizeWE;
            }
            else if(Y<1 || Y>=ClientHeight-1)
            {
                    Cursor=crSizeNS;
            }
            else
            {
                    Cursor=crDefault;
            }
    }
    

    Soweit so gut.

    Ich habe außerdem das hier im Archiv gefunden, um z. B. Fenster bewegen zu können. Nun kann ich mir vorstellen, dass der Ansatz, die Fenstergröße zu verändern, ähnlich ist, wie das Bewegen. Aber ich habe leider nichts vernünftiges im Netz dazu gefunden.

    Kennt jemand von euch einen Weg, das zu bewerkstelligen?



  • Ich habe bisher das hier gefunden: msdn.microsoft.com

    Allerdings verstehe ich nicht ganz, wie ich das noch richtig einsetze. Mein versuch:

    SendMessage(fMain->Handle,WM_SYSCOMMAND,SC_SIZE+HTCAPTION,0);
    

    Aber das bewirkt, dass das Fenster nur nach rechts hin vergrößert / verkleinert werden kann.

    Die Frage also: Welche Parameter muss ich noch hinzufügen, um die Richtung anzusteuern?



  • Hallo,
    hier http://www.delphipraxis.net/105188-wm_syscommand-probleme-mit-sc_size.html hatte jemand ein ähnliches Problem.

    Viel Erfolg



  • Danke! Das war auch schon der entscheidende Hinweis.

    Die Lösung:

    void __fastcall TfMain::FormMouseMove(TObject *Sender, TShiftState Shift,
          int X, int Y)
    {
            if(ResizeEnabled)
            {
                    if((X<1 && Y<=ResizeTolerance) || (X<=ResizeTolerance && Y<1))
                    {
                            Cursor=crSizeNWSE;
                            ResizeDirection=WMSZ_TOPLEFT;
                    }
                    else if((X>=ClientWidth-1-ResizeTolerance && Y>=ClientHeight-1) || (X>=ClientWidth-1 && Y>=ClientHeight-1-ResizeTolerance))
                    {
                            Cursor=crSizeNWSE;
                            ResizeDirection=WMSZ_BOTTOMRIGHT;
                    }
                    else if((X<=ResizeTolerance && Y>=ClientHeight-1) || (X<1 && Y>=ClientHeight-1-ResizeTolerance))
                    {
                            Cursor=crSizeNESW;
                            ResizeDirection=WMSZ_BOTTOMLEFT;
                    }
                    else if((X>=ClientWidth-1-ResizeTolerance && Y<1) || (X>=ClientWidth-1 && Y<=ResizeTolerance))
                    {
                            Cursor=crSizeNESW;
                            ResizeDirection=WMSZ_TOPRIGHT;
                    }
                    else if(X<1)
                    {
                            Cursor=crSizeWE;
                            ResizeDirection=WMSZ_LEFT;
                    }
                    else if(X>=ClientWidth-1)
                    {
                            Cursor=crSizeWE;
                            ResizeDirection=WMSZ_RIGHT;
                    }
                    else if(Y<1)
                    {
                            Cursor=crSizeNS;
                            ResizeDirection=WMSZ_TOP;
                    }
                    else if(Y>=ClientHeight-1)
                    {
                            Cursor=crSizeNS;
                            ResizeDirection=WMSZ_BOTTOM;
                    }
                    else
                    {
                            Cursor=crDefault;
                    }
            }
    }
    
    //...
    
    void __fastcall TfMain::FormMouseDown(TObject *Sender, TMouseButton Button,
          TShiftState Shift, int X, int Y)
    {
            if(ResizeEnabled && Button==mbLeft)
            {
                    ReleaseCapture();
                    SendMessage(fMain->Handle,WM_SYSCOMMAND,SC_SIZE|ResizeDirection,0);
            }
    }
    

    Als Hinweis: Auf der Form liegt ein Canvas mit einem 1px Abstand zu jeder Seite. Ansonsten müsste beim MouseDown auch noch einmal die Cursor-Position abgefragt werden.

    Vielen Dank!


Log in to reply