2008-08-12 129 views
3

我有一個用Delphi 2006編寫的MDI應用程序,該應用程序使用默認主題運行XP。德爾福MDI應用程序和MDI兒童的標題欄

是否有一種方法可以控制MDI Children的外觀以避免每個窗口上的大型XP風格的標題欄?

我已經嘗試設置MDIChildrenbsSizeToolWinBorderStyle,但他們仍然呈現正常的形態。

回答

4

您所有的需求 - 載過程CreateWindowHandle,像這樣:

unit CHILDWIN; 
interface 
uses Windows, Classes, Graphics, Forms, Controls, StdCtrls; 

type 
    TMDIChild = class(TForm) 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    procedure CreateWindowHandle(const Params: TCreateParams); override; 
    end; 

implementation 

{$R *.dfm} 
procedure TMDIChild.CreateWindowHandle(const Params: TCreateParams); 
begin 
    inherited CreateWindowHandle(Params); 
    SetWindowLong(Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW); 
end; 
end. 
0

我不認爲有;根據我的經驗,Delphi中的MDI非常嚴格地受到其在VCL中的實現(也可能由Windows API?)的控制。例如,不要試圖隱藏一個MDI子項(如果你嘗試了,你會得到一個異常,並且你必須通過幾個API圈來解決這個問題),或者改變一個MDI子項的主菜單與主機表單合併。

鑑於這些限制,您可能應該重新考慮爲什麼您想在第一個地方放置特殊的標題欄?我想也有爲什麼這個東西MDI是標準化的很好的理由---你的用戶可能會欣賞它:)

(PS:很高興看到德爾福的問題在這裏)

0

感謝onnodb

不幸的是,客戶堅持使用MDI和較小的標題欄。

我已經制定了一種方法,它是通過覆蓋窗口CreateParams來隱藏標題欄,然後創建我自己的標題欄(帶有一些鼠標處理移動的簡單面板)。工作得不錯,所以我想我可能會運行它的客戶端,看看它是否會做...

1

MDI的工作方式不凝結你想要做什麼。

如果您需要「MDI」格式,則應考慮使用內置對接套件或commercial對接套件,並使用對接設置來模擬MDI感覺。

在我的Delphi應用程序中,我經常使用TFrames並將它們添加到主窗體中,並將​​它們最大化,以使它們佔據客戶區域。這給你類似於Outlook的外觀。它會有點像這樣:

TMyForm = class(TForm) 
private 
    FCurrentModule : TFrame; 
public 
    property CurrentModule : TFrame read FModule write SetCurrentModule; 
end; 

procedure TMyForm.SetCurrentModule(ACurrentModule : TFrame); 
begin 
    if assigned(FCurrentModule) then 
    FreeAndNil(FCurrentModule); // You could cache this if you wanted 
    FCurrentModule := ACurrentModule; 
    if assigned(FCurrentModule) then 
    begin 
    FCurrentModule.Parent := Self; 
    FCurrentModule.Align := alClient; 
    end; 
end; 

要使用它,你可以簡單地這樣做:

MyForm.CurrentModule := TSomeFrame.Create(nil); 

還有就是你應該使用接口(創建的IModule接口什麼的)一個很好的理由你使用的。我經常這樣做,但這比解釋這裏的概念更復雜。

HTH