2012-06-06 14 views
8

Jak przenieść formularz bez obramowania? Próbowałem szukać w Internecie, ale nic. Wielkie dzięki.Przenoszenie formularza bez stylu obramowania

+0

mogą tu być: http://delphi.about.com/od/windowsshellapi/a/dragnocaption.htm – philnext

+0

Duplikat [C++ Builder: Tworzenie TForm z BorderStyle bsNone że jest jednak ruchoma i skalowalny ] (http://stackoverflow.com/questions/7178030/cbuilder-create-a-formforma-z-borderstyle-bsnone-to-is-nevious-movable) - ten kod jest dla C++ Builder, ale wciąż jest ten sam VCL! Przejście na Delphi powinno być trywialne. –

Odpowiedz

16

Możesz przeciągnąć formularz za pomocą dowolnej kontrolki, w tym samej siebie.

Korzystając z poniższego przykładu, możesz przenieść formularz, klikając jego płótno i przeciągając. Możesz zrobić to samo z panelem w formularzu, umieszczając ten sam kod w zdarzeniu MouseDown panelu, co pozwoli ci stworzyć własny pasek pseudopisów.

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; 
    Shift: TShiftState; X, Y: Integer); 
const 
    SC_DRAGMOVE = $F012; 
begin 
    if Button = mbLeft then 
    begin 
    ReleaseCapture; 
    Perform(WM_SYSCOMMAND, SC_DRAGMOVE, 0); 
    end; 
end; 
+0

Dzięki, ten kod jest lepszy! –

13

Jeśli chodzi o przeciągnięcie okna za pomocą myszy, można zastąpić obsługę wiadomości WM_NCHITTEST i zwrócić dla regionu przeciągania wartość HTCAPTION. Poniższe okno przeciągnie okno w górnej 30 pikseli dla insance:

type 
    TForm1 = class(TForm) 
    private 
    protected 
    procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST; 
    end; 

.. 

procedure TForm1.WMNCHitTest(var Message: TWMNCHitTest); 
var 
    Pt: TPoint; 
begin 
    Pt := ScreenToClient(SmallPointToPoint(Message.Pos)); 
    if Pt.Y < 30 then 
    Message.Result := HTCAPTION 
    else 
    inherited; 
end; 
+4

+1 to jest sposób, aby to zrobić. –

+0

@ David: Ostatnio byłem trochę sceptycznie nastawiony do tego podejścia, ponieważ, zasadniczo, mówisz OS, że * cała forma jest podpisem okna *, co może nie być być semantycznie prawdziwe. (Cóż, w kodzie Sertaca prawdopodobnie pierwsze 30 pikseli * jest * w rzeczywistości podpisem, ale generalnie może to nie być prawdą.) –

+0

@andreas Czy masz jakiś konkretny powód, aby to odrzucić? Jakie są wady? Jest to standardowe podejście. –

Powiązane problemy