TOpenDialog를 사용하여 사용자가 파일을 선택할 수 있도록하는 Delphi 응용 프로그램이 있습니다. 기본적으로 열려있는 대화 상자는 현재 모니터의 중앙에 표시되며 요즘에는 응용 프로그램의 창에서 멀어 질 수 있습니다. 대화 상자가 TOpenDialog의 소유자 컨트롤을 중심으로 표시되도록하고 싶습니다. 실패하면 응용 프로그램의 기본 창에 정착합니다. 그것은 나에게 그것을 수행하는 방법에 대한 몇 가지 힌트를 준 TJvOpenDialog에서 파생어떻게 TOpenDialog를 배치합니까?
작품의 다음 코드 종류 : 의미
type
TMyOpenDialog = class(TJvOpenDialog)
private
procedure SetPosition;
protected
procedure DoFolderChange; override;
procedure WndProc(var Msg: TMessage); override;
end;
procedure TMyOpenDialog.SetPosition;
begin
var
Monitor: TMonitor;
ParentControl: TWinControl;
Res: LongBool;
begin
if (Assigned(Owner)) and (Owner is TWinControl) then
ParentControl := (Owner as TWinControl)
else if Application.MainForm <> nil then
ParentControl := Application.MainForm
else begin
// this code was already in TJvOpenDialog
Monitor := Screen.Monitors[0];
Res := SetWindowPos(ParentWnd, 0,
Monitor.Left + ((Monitor.Width - Width) div 2),
Monitor.Top + ((Monitor.Height - Height) div 3),
Width, Height,
SWP_NOACTIVATE or SWP_NOZORDER);
exit; // =>
end;
// this is new
Res := SetWindowPos(GetParent(Handle), 0,
ParentControl.Left + ((ParentControl.Width - Width) div 2),
ParentControl.Top + ((ParentControl.Height - Height) div 3),
Width, Height,
SWP_NOACTIVATE or SWP_NOZORDER);
end;
procedure TMyOpenDialog.DoFolderChange
begin
inherited DoFolderChange; // call inherited first, it sets the dialog style etc.
SetPosition;
end;
procedure TMyOpenDialog.WndProc(var Msg: TMessage);
begin
case Msg.Msg of
WM_ENTERIDLE: begin
// This has never been called in my tests, but since TJVOpenDialog
// does it I figured there may be some fringe case which requires
// SetPosition being called from here.
inherited; // call inherited first, it sets the dialog style etc.
SetPosition;
exit;
end;
end;
inherited;
end;
"작품의 종류"대화 상자가 그것을 열 때 처음 그 소유자 양식의 중앙에 표시됩니다. 하지만 대화 상자를 닫고 창을 이동 한 다음 대화 상자를 다시 열면 SetWindowPos가 true를 반환하더라도 아무 효과가없는 것 같습니다. 대화 상자는 처음과 같은 위치에서 열립니다.
이것은 Windows XP에서 실행되는 Delphi 2007에서 대상 상자는 Windows XP에서도 실행됩니다.
이 잘못된 솔루션 것 같은 느낌이 든다. 일반적인 대화를 통해 그런 식으로 파고 들지 않으려 고합니다. 필자는 Delphi의 최신 버전이 이러한 문제를 해결하기 위해 공통 대화 상자의 코드를 향상 시켰음을 알고 있습니다. 이 변경 사항이 나타난 델파이의 버전이 확실하지 않지만 문제가 될 수 있습니다. 시스템 공통 대화 상자가 올바르게 사용될 때 (그리고 VCL이 항상 그렇게하지 않은 경우) 현명한 위치에 나타나고 심지어 이전 세션의 크기와 위치를 기억합니다. –
HWndOwner를 OpenDialog.Execute에 전달하고 있습니까? D2007 (심지어 이전에 추가 된 것 같습니다)에는이 문제를 해결하기 위해 부모 창 핸들을 허용하는 Execute 오버로드 된 버전이 있습니다. –
이전 대화 상자의 코드를 살펴보면 기본 창 프로 시저에 메시지를 전달하기 전에 'WM_SHOWWINDOW'메시지에 대한 응답으로 배치를 완료 한 것을 볼 수 있습니다. –