我有一个用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