2012-02-27 150 views
-2

有一個很好的組件可以最大化客戶區(必須保持SHIFT鍵)的子窗口- NLDExtraMDIPropsDelphi:最大化MDI項目中的子窗口

或者可以使用此代碼:

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

procedure TForm2.WMSIZE(var Msg: TMessage); 
begin 
    inherited; 
    if Msg.WParam = SIZE_MAXIMIZED then 
    begin 
    ShowWindow(Handle, SW_RESTORE); 
    Left := 0; 
    Top := 0; 
    Width := Form1.ClientWidth - 4; // The BORDER 
    Height := Form1.ClientHeight - 4; 
    end; 
end; 

但最大化是不是真實的最大化。子窗口僅與客戶區域對齊。當父窗口調整大小時,它必須自動調整大小並適合客戶區域,最大化/恢復系統按鈕必須改變等。

我嘗試完成下面描述的效果。

正如你所看到的子窗口最大化的照片,並

1)他們不走整個父窗口(只有客戶區)。

2)它的不可能移動它們在標題欄/標題欄上,因爲它們是最大化的。

3)他們有還原按鈕,而不是最大化按鈕。

4)它們是對齊到客戶區域(調整父窗口的大小導致孩子與客戶區域的大小)。

我的問題和組件的代碼不像圖片上的子窗口。

我們可以讓一個窗口真正最大化(不只是對齊)嗎?

沒有最大化(不好;組件,並從我的問題的代碼最大限度地喜歡上這些照片):

enter image description hereenter image description here

最大化(我需要什麼):

enter image description here enter image description here

回答

6

我不明白你的問題。最大化的MDI子窗口完成:

  • 編程:通過手動使用ShowWindow(ActiveMDIChild.Handle, SW_MAXIMIZE)
  • :單擊右上角的最大化邊界圖標,或通過在窗體標題雙擊。

這兩種行爲導致:

  • 子窗口邊框消失(摺疊成MDI形式邊框),
  • 加邊境小額圖標(子窗口)主菜單欄
  • 調整後的效果與Align=alClient類似。

要限制主窗體中子窗口的可用空間,請確保將窗口控件與窗體的邊緣對齊。

爲MDI子窗口設置AlignAnchors屬性不起作用:它們不再是默認VCL對齊實現的一部分; Windows已經接管了這個工作。

如果您想介入調整MDI子級的大小,則處理WM_SIZE是錯誤的方法,因爲該消息是在調整大小後發送的。相反,按照我解釋的here來處理WM_SYSCOMMAND

至於我的組件您參考:

  • 單擊右上角的最大化邊界圖標正是這麼做的手動最大化:默認的最大化作爲上述操作,
  • 單擊右上角的最大化邊界圖標手動最大化 - 按住Shift鍵 - 將MDI窗體內的子窗口調整爲largest spare space。在這種情況下,調整MDI主窗體的大小不會調整MDI子窗體的大小。
+0

嗨!NGLN!請在我的問題中查看圖片的區別。子窗口最大化,並且不佔用整個主窗口(僅客戶區域)。移動它們是不可能的,因爲它們是最大化的。他們有恢復按鈕,而不是最大化按鈕。它們與客戶區域對齊(調整父窗口的大小會導致調整客戶區域的子區域)。我的問題和你的組件的代碼不會複製圖片上的子窗口的行爲。 – maxfax 2012-02-27 04:25:41

+0

第一張照片是你的組件和我的問題中的代碼(相同的效果)。最後2 - 如何必須。 – maxfax 2012-02-27 04:35:11

+0

我仍然不明白你的問題。如果你做得很好(爲主表單設置'FormStyle = fsMDIForm',爲子表單設置'FormStyle = fsMDIChild'),那麼還有其他問題。 – NGLN 2012-02-27 04:42:30

-1
if (Msg.WParam = SIZE_MAXIMIZED) then 
    begin 
    Left := 0; 
    Top := 0; 
    Width := frmMain.ClientWidth - 4; 
    Height := frmMain.ClientHeight - 4; 
    SendMessage(Handle, WM_SIZE, SIZE_RESTORED, 0); 
    end;