gpt4 book ai didi

delphi - Windows 8 中的对话框向左上方移动

转载 作者:行者123 更新时间:2023-12-01 19:51:05 24 4
gpt4 key购买 nike

此对话框正好显示在按钮下方,但在 Windows 8 中,对话框移至左侧和上方。如何在所有 Windows 版本中获得相同的结果?

procedure TForm1.Button3Click(Sender: TObject);
var p: TPoint;
begin
p := Button3.ClientToScreen(Point(0, Button3.Height));
MessageDlgPos('', mtInformation, [mbOK], 0, p.X, p.Y);
end;

Shifted dialog in Win 8

更新:如果我们打开 Form 而不是 Dialog,并且该 Form 有 BorderStyle bsSizeable 或 bsSizeToolWin,则一切正常。否则(bsDialog、bsSingle、bsToolWindow),窗体打开方式将与上例中的 Dialog 一样。

最佳答案

运行您在 Windows 7 上显示的确切代码,我无法重现您在 Windows 7 屏幕截图中显示的相同对话框位置。 MessageDlgPos 窗口向上并向左偏移,方式与 Windows 8 屏幕截图相同:

screenshot

话虽这么说,我注意到您正在将 MessageDlg 窗口相对于按钮的客户区定位:

screenshot

如果您希望对话框相对于其实际底边定位,则需要在按钮的Parent上调用ClientToScreen(),而不是在按钮本身上:

p := Button3.Parent.ClientToScreen(Point(Button3.Left, Button3.Top+Button3.Height));

screenshot

不过,最终结果大致相同:

screenshot

现在,为什么会出现重叠呢?因为窗口的定位使其非客户区域的左上角落在指定的坐标处:

screenshot

您可以调整窗口坐标来解决这个问题:

p := Button3.Parent.ClientToScreen(Point(Button3.Left, Button3.Top + Button3.Height));
Inc(p.X, GetSystemMetrics(SM_CXFIXEDFRAME) + GetSystemMetrics(SM_CXBORDER));
Inc(p.Y, GetSystemMetrics(SM_CYFIXEDFRAME) + GetSystemMetrics(SM_CYBORDER));

这会让您更接近所需的位置:

screenshot

请注意,Aero 对系统指标进行了一些“调整”,因此您可能需要使用类似 DwmGetWindowAttribute(DWMWA_EXTENDED_FRAME_BOUNDS) 的内容。和/或GetThemeSysSize()以获得更准确的指标。

关于delphi - Windows 8 中的对话框向左上方移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29576140/

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