2010-08-17 3 views
2

어떻게하면 Delphi 또는 C++ Builder에서 MDI 자식 윈도우 (FormStyle : = fsMDIChild)의 배치를 제어 할 수 있습니까? Left, Top, Position 등을 설정할 수 있지만, 특히 MDI 자식의 경우에는 창이 이미 만들어져 기본 위치에 표시 될 때까지 적용되지 않습니다. 결과적으로 여러 창을 한 번에 배치하고 위치 시키면 창이 기본 위치에 생성 된 후 즉시 이동되고 크기가 조정되므로 깜박임 현상이 발생합니다.Delphi에서 fsMDIChild 윈도우의 배치 제어

VCL 소스를 탐색하면서 찾을 수 있었던 유일한 해결책은 TCustomForm의 CreateParams 메서드를 무시하고 Params 매개 변수의 X, Y, 너비 및 높이 필드를 변경하는 것이지만 해킹 같은 느낌입니다 . 이 일을하는 더 깨끗한 방법이 있습니까?

답변

1

전혀 깜박 거리지 않지만 컴퓨터가 너무 빠르거나 깜박임 현상을 줄이기 위해 Windows 7이 개선되었을 수 있습니다. 의 wParam를 True로 설정과의 wParam 나중에 다음 False로 설정하고 사용하면 MainForm의 ClientHandle, 하나 WM_SETREDRAW 메시지를 보낼 수 있습니다

procedure TForm2.FormShow(Sender: TObject); 
begin 
    Top := 200; 
    Left := 400; 
end; 
+1

감사합니다. 나는 생성자에서 그것을 시도하고 OldCreateOrder가 true로 설정되었음을 깨닫지 못했습니다. OldCreateOrder를 고정하면 생성자와 FormShow를 모두 사용할 수 있습니다. –

2

:

나는 그 FormShow에서 MDI 자식 창 위치를 설정 당신이 MDI 자식 창을 설정하는 동안 깜빡 거림을 피하기 위해, 예를 들면 :

델파이 :

SendMessage(Application.MainForm.ClientHandle, WM_SETREDRAW, False, 0); 
try 
    Child := TChildForm.Create(Self); 
    Child.Left := ...; 
    Child.Top := ...; 
    Child.Show; 
finally 
    SendMessage(Application.MainForm.ClientHandle, WM_SETREDRAW, True, 0); 
    InvalidateRect(Application.MainForm.ClientHandle, nil, True); 
end; 

C++ :

SendMessage(Application->MainForm->ClientHandle, WM_SETREDRAW, FALSE, 0); 
try 
{ 
    Child = new TChildForm(this); 
    Child->Left = ...; 
    Child->Top = ...; 
    Child->Show(); 
} 
__finally 
{ 
    SendMessage(Application->MainForm->ClientHandle, WM_SETREDRAW, TRUE, 0); 
    InvalidateRect(Application->MainForm->ClientHandle, NULL, TRUE); 
} 
+0

감사합니다. "Remarks"에서 http://msdn.microsoft.com/en-us/library/dd145219%28VS.85%29.aspx에 설명 된대로 InvalidateRect 대신 RedrawWindow를 사용하여 MDI 자식을 제대로 다시 그려야했습니다. –

+0

InvalidateRect()를 사용하면 제대로 작동합니다. 설명은 MDI 창이 아니라 ListBox를 참조합니다. –