Delphi FAQ - Как центрировать по форме модальный диалог?

ОГЛАВЛЕНИЕ


Как центрировать по форме модальный диалог?

procedure CenterDialogPos(DlgHandle, WindowHandle: HWND);
var
  DlgRect : TRect;
  WndRect : TRect;
  x, y, w, h : integer;
begin
  if (DlgHandle <> 0) then begin
    GetWindowRect(DlgHandle, DlgRect);
    GetWindowRect(WindowHandle, WndRect);
    w := DlgRect.Right - DlgRect.Left;
    h := DlgRect.Bottom - DlgRect.Top;
    file://center horz
    x := WndRect.Left + ((WndRect.Right - WndRect.Left - w) div 2);
    file://keep on screen
    if x < 0 then x := 0
    else if x + w > Screen.Width then x := Screen.Width - w;
    file://center vert
    y := WndRect.Top + ((WndRect.Bottom - WndRect.Top - h) div 2);
    file://keep on screen
    if y < 0 then  y := 0
    else if y + h > Screen.Height then  y := Screen.Height - h;
    SetWindowPos(DlgHandle, 0, x, y, 0, 0, SWP_NOACTIVATE or SWP_NOSIZE or
SWP_NOZORDER);
  end;
end;

procedure TForm1.WMUser1(var msg: TMessage); // message WM_USER+1;
begin
  CenterDialogPos(GetActiveWindow, Handle);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  PostMessage(Handle, WM_USER+1, 0, 0);
  ShowMessage('Test');
end;