2012-03-14 21 views
8

Belirli ayarları (boyut veya konumla ilgili olmayan) kaydetmek ve boyutu değiştirmek ve biraz değiştirmek için formun ne zaman maksimuma çıkarılacağını belirlemek istiyorum. Bunu yapmanın evrensel bir yolu var mı? this article'da olduğu gibi WM_SYSCOMMAND mesajını yakalamaya çalıştım. Menüden maksimize etmek için, ekranı en üst düzeye çıkarmak için iyi çalışır, ancak WIN + UP tuşa bastığımda yanmaz. WIN + UP tuş vuruşuyla davanın dahil olduğu en büyük olayı nasıl yakalayacağımızı evrensel bir şekilde bilen var mı?Form ne zaman büyütüldüğünde nasıl tespit edilir?

Teşekkür

+4

Eğer 'WM_GETMINMAXINFO' işleyebilir. – kobik

+0

@kobik, teşekkürler, ama boyut ve pozisyon yapmak istediğim tek şey değil (kötü örnek, biliyorum). Pencerenin ne zaman maksimize edileceğini gerçekten anlamaya ihtiyacım var ve WM_GETMINMAXINFO'da bunu tanıyamıyorum. –

cevap

11

Pencerenin durumunu kaydetmek için WM_GETMINMAXINFO mesajı kullanabilir ve daha sonra pencere maksimize olmadığını da kontrol etmek WMSize mesajı kullanabilirsiniz.

procedure WMSize(var Msg: TMessage); message WM_SIZE; 

Ve böyle idare: Eğer şöyle mesage işleyicisi beyan formu içinde

onları yakalamak olamaz neden

procedure TForm57.WMSize(var Msg: TMessage); 
begin 
    if Msg.WParam = SIZE_MAXIMIZED then 
    ShowMessage('Maximized');  
end; 
+1

Bu ateşi çok mu geç aldın? (* formun maksimize edildiğinden sonra). – kobik

+1

@kobik, Evet bu ileti en üst düzeye çıkarıldıktan sonra tetiklenir, OP durumu kaydetmek için 'WM_GETMINMAXINFO' kullanabilir ve daha sonra pencerenin maksimum olup olmadığını kontrol etmek için' WMSize 'özelliğini kullanabilir. – RRUZ

7

WIN + YUKARI WM_SYSCOMMAND mesajları oluşturmaz, olmasıdır. Yine de, WM_GETMINMAXINFO, WM_WINDOWPOSCHANGING, WM_NCCALCSIZE, WM_MOVE, WM_SIZE ve WM_WINDOWPOSCHANGED mesajlarını üretir. RRUZ'un dediği gibi, bir maksimize işleminin ne zaman başlayacağını ve ne zaman tamamlandığını algılamak üzere olduğunu tespit etmek için WM_GETMINMAXINFO kullanın. @Remy belirtildiği gibi "en üst düzeye çıkar operasyonu başlamak üzere olduğunda algılamak"

7

IMO, Sen hiç WM_GETMINMAXINFO kullanamazsınız. ama Win+UP yoluyla veya örneğin ShowWindow(Handle, SW_MAXIMIZE) kullanarak gönderiliyor değil - can Msg.CmdType=SC_MAXIMIZE veya belgesiz SC_MAXIMIZE2 = $F032 ile WM_SYSCOMMAND olduğunu

In-aslında sadece mesaj. Ben bir pencere maksimize edilmek üzere olduğunu tespit olabilir

tek yolu WM_GETMINMAXINFO sonra sağ ateş edildiği WM_WINDOWPOSCHANGING yoluyladır:

type 
    TForm1 = class(TForm) 
    private 
    procedure WMWindowPosChanging(var Message: TWMWindowPosChanging); message WM_WINDOWPOSCHANGING; 
    end; 

implementation 

const 
    SWP_STATECHANGED = $8000; 

procedure TForm1.WMWindowPosChanging(var Message: TWMWindowPosChanging); 
begin 
    inherited; 
    if (Message.WindowPos^.flags and (SWP_STATECHANGED or SWP_FRAMECHANGED)) <> 0 then 
    begin 
    if (Message.WindowPos^.x < 0) and (Message.WindowPos^.y < 0) then 
     ShowMessage('Window state is about to change to MAXIMIZED'); 
    end; 
end;