我有一個用Delphi 2006編寫的MDI應用程序,該應用程序使用默認主題運行XP。德爾福MDI應用程序和MDI兒童的標題欄
是否有一種方法可以控制MDI Children的外觀以避免每個窗口上的大型XP風格的標題欄?
我已經嘗試設置MDIChildren
到bsSizeToolWin
的BorderStyle
,但他們仍然呈現正常的形態。
我有一個用Delphi 2006編寫的MDI應用程序,該應用程序使用默認主題運行XP。德爾福MDI應用程序和MDI兒童的標題欄
是否有一種方法可以控制MDI Children的外觀以避免每個窗口上的大型XP風格的標題欄?
我已經嘗試設置MDIChildren
到bsSizeToolWin
的BorderStyle
,但他們仍然呈現正常的形態。
您所有的需求 - 載過程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.
我不認爲有;根據我的經驗,Delphi中的MDI非常嚴格地受到其在VCL中的實現(也可能由Windows API?)的控制。例如,不要試圖隱藏一個MDI子項(如果你嘗試了,你會得到一個異常,並且你必須通過幾個API圈來解決這個問題),或者改變一個MDI子項的主菜單與主機表單合併。
鑑於這些限制,您可能應該重新考慮爲什麼您想在第一個地方放置特殊的標題欄?我想也有爲什麼這個東西MDI是標準化的很好的理由---你的用戶可能會欣賞它:)
(PS:很高興看到德爾福的問題在這裏)
感謝onnodb
不幸的是,客戶堅持使用MDI和較小的標題欄。
我已經制定了一種方法,它是通過覆蓋窗口CreateParams來隱藏標題欄,然後創建我自己的標題欄(帶有一些鼠標處理移動的簡單面板)。工作得不錯,所以我想我可能會運行它的客戶端,看看它是否會做...
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