Я пытаюсь выровнять свою дочернюю форму после основной формы "бок о бок", но у меня возникают некоторые трудности
Чтобы воспроизвести проблему, создайте новое приложение VCL и добавьте в форму одну кнопку:
procedure TForm1.Button1Click(Sender: TObject);
var
Form: TForm1;
begin
Application.CreateForm(TForm1, Form);
Form.BorderStyle := bsSingle;
Form.Left := Left + Width;
Form.Top := Top;
Form.Show;
end;
И результат:
Windows 7:
Windows 10:
После использования Winapi.DwmApi
:
DXR1 := 0;
DXL2 := 0;
if (Win32MajorVersion >= 6) and DwmCompositionEnabled then begin
DwmGetWindowAttribute(Handle, DWMWA_EXTENDED_FRAME_BOUNDS, @R1, SizeOf(R1));
Winapi.Windows.GetWindowRect(Handle, R2);
DXR1 := R2.Right - R1.Right;
DYT1 := R2.Top - R1.Top;
end;
FormJob.Left := Left + Width - DXR1;
FormJob.Top := Top - DYT1;
FormJob.Show;
if (Win32MajorVersion >= 6) and DwmCompositionEnabled then begin
DwmGetWindowAttribute(FormJob.Handle, DWMWA_EXTENDED_FRAME_BOUNDS, @R1, SizeOf(R1));
Winapi.Windows.GetWindowRect(FormJob.Handle, R2);
DXL2 := R1.Left - R2.Left;
DYT2 := R2.Top - R1.Top;
end;
FormJob.Left := FormJob.Left - DXL2;
FormJob.Top := FormJob.Top + DYT2;
И теперь это полностью выровнено на Windows 7 и Windows 10
Windows 7: Windows 10:
Но для этого мне нужно сначала показать дочернюю форму. Если я вызываю DwmGetWindowAttribute
для дочерней (и невидимой) формы перед показом, я получаю те же значения, что и для GetWindowRect
. Невозможно получить это до показа?