Forms 如何使窗体中的控件以相同的大小和位置显示,而不考虑系统的DPI?

Forms 如何使窗体中的控件以相同的大小和位置显示,而不考虑系统的DPI?,forms,delphi,controls,scale,dpi,Forms,Delphi,Controls,Scale,Dpi,根据我的经验,我注意到有三种类型的应用程序: 符合Windows DPI设置并正确缩放的 那些总是保持一切在同一像素位置,不缩放任何东西(这就是我想要的) 那些无法处理非标准DPI设置的设备,因此它们的控制到处都是。此类程序有时建议用户更改其DPI设置 我已经知道在Win32 API中有SetProcessDPIAware()和SetProcessDPIAware()函数,在TForm类中有Scaled和PixelsPerInch属性 我已经尝试过这些东西,搜索过网络,但我还没有找到或开发出任何

根据我的经验,我注意到有三种类型的应用程序:

  • 符合Windows DPI设置并正确缩放的

  • 那些总是保持一切在同一像素位置,不缩放任何东西(这就是我想要的)

  • 那些无法处理非标准DPI设置的设备,因此它们的控制到处都是。此类程序有时建议用户更改其DPI设置

  • 我已经知道在Win32 API中有
    SetProcessDPIAware()
    SetProcessDPIAware()
    函数,在
    TForm
    类中有
    Scaled
    PixelsPerInch
    属性


    我已经尝试过这些东西,搜索过网络,但我还没有找到或开发出任何可靠的方法。

    要实现您的愿望:

  • 在应用程序清单中声明程序支持DPI。这将确保系统不会将您的程序作为窗口合成机制的一部分进行缩放
  • 将每个表单的
    Scaled
    属性设置为
    False
    。这可确保表单及其控件不会按当前DPI进行缩放
  • 在应用程序清单中,使用以下设置:

    <asmv3:application xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
      <asmv3:windowsSettings
           xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
        <dpiAware>True/PM</dpiAware>
      </asmv3:windowsSettings>
    </asmv3:application>
    

    请允许我不同意:该用户询问的是“行为良好”。我甚至不知道他那是什么意思。你认为他指的是无论系统的DPI如何,都以相同的大小和位置出现吗?只是想澄清一下:以上评论是对Ken White将问题标记为重复问题的回答。谢谢你,我已经尝试过了,只希望它能起作用,因为我还没有能够测试它。谢谢,我已经试过了,只希望它能起作用,因为我还没能测试它。
    type
      TBaseForm = class(TForm) // all forms in your program must derive from this base class
      protected
        procedure WMDpiChanged(var Msg: TMessage); message WM_DPICHANGED;
      end;
    
    ....
    
    procedure TBaseForm.WMDpiChanged(var Msg: TMessage);
    begin
      // return 0 to indicate that we have processed the message
      Msg.Result := 0;
    end;