gpt4 book ai didi

forms - Delphi:在dll中定位表单

转载 作者:行者123 更新时间:2023-12-03 15:42:27 26 4
gpt4 key购买 nike

我正在 dll 中创建一个表单。没有包裹。使用导出的过程调用dll中的表单:

procedure ShowAbout(const AppHandle: THandle); stdcall;
var
aHandle: THandle;
form: TfrmAbout; / my form in some other unit in the dll
begin

aHandle:= Application.Handle;
Application.Handle:= AppHandle;

form :=TfrmAbout.Create(Application);
form.ShowModal;
form.Free;
Application.Handle:= aHandle;
end;

表单显示良好,没有任何问题。现在,我唯一希望它做的就是将其定位为 poMainFormCenter(我希望它始终显示在主窗体(调用 dll 的窗体)上。

我尝试过使用 form :=TfrmAbout.Create(Application.MainForm);等等但没有运气。

有什么技巧可以帮助这里吗?

最佳答案

VCL Position 机制依赖于应用程序中所有使用相同版本的 VCL 运行的其他表单。显然这里的情况并非如此,您必须手动定位表单。

通过调用GetWindowRect()找出主窗体的位置传递主窗体句柄。然后,您需要确定表单需要位于该表单中心的位置。

procedure PositionForm(Form: TForm; MainWindow: HWND);
var
MainBounds: TRect;
MainWidth, MainHeight: Integer;
begin
if GetWindowRect(MainWindow, MainBounds) then
begin
MainWidth := MainBounds.Right-MainBounds.Left;
MainHeight := MainBounds.Bottom-MainBounds.Top;
Form.Left := MainBounds.Left + (MainWidth - Form.Width) div 2;
Form.Top := MainBounds.Top + (MainHeight - Form.Height) div 2
end;

顺便说一句,您传递的句柄是 HWND 而不是 THandle。您应该相应地更改代码。它不会改变行为,但这样做在逻辑上是正确的。

关于forms - Delphi:在dll中定位表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7832936/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com