2008-08-12 3 views
3

기본 테마로 XP를 실행하는 Delphi 2006로 작성된 MDI 응용 프로그램이 있습니다.Delphi MDI 응용 프로그램과 MDI Children의 제목 표시 줄

각 창에 큰 XP 스타일 제목 표시 줄을 피하기 위해 MDI Children의 모양을 제어하는 ​​방법이 있습니까?

MDIChildrenBorderStylebsSizeToolWin으로 설정했지만 정상적인 양식으로 렌더링되었습니다.

답변

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와 작은 제목 표시 줄을 고집합니다.

Windows CreateParams를 재정 의하여 제목 표시 줄을 숨긴 다음 이동을위한 마우스 처리 기능이있는 간단한 패널을 만드는 방법을 알아 냈습니다. 충분히 잘 작동하므로 클라이언트가 실행하여 작업을 수행 할 수 있는지 확인하십시오.

1

MDI의 작동 방식은 수행하려는 작업으로 젤화되지 않습니다.

"MDI"형식이 필요한 경우 기본 제공 또는 commercial 도킹 패키지를 사용하고 도킹 설정을 사용하여 MDI 느낌을 모방 해보십시오.

내 델파이 앱에서는 주로 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); 

당신이 인터페이스 (AN IModule 인터페이스 또는 뭔가를 만드는)를 사용해야 좋은 인수가 당신이 사용하는. 종종 그렇게 하긴하지만, 개념을 설명하는 데 필요한 것보다 더 복잡합니다.

HTH