2017-06-17 34 views
-1

根据我的经验,我已经注意到,有3种类型的应用程序:如何使窗体中的控件以相同的大小和位置显示,而不管系统的DPI如何?

  1. 那些与Windows DPI设置,并得到正确缩放相处。

  2. 那些总是保持在一样的像素位置,并没有扩展任何东西(这是我想要的)。

  3. 那些不能应付非标准DPI设置,所以他们的控制都在这个地方。此类程序有时会建议用户更改其DPI设置。

我已经知道有SetProcessDPIAwareness()SetProcessDPIAware()功能Win32 API中,并在TFormScaledPixelsPerInch性能。

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

+0

请允许我不同意:该用户问“表现良好”。我甚至不知道他的意思。你认为他的意思是出现在相同的大小和位置,不管系统的DPI如何? –

+0

只是为了说明问题:上述评论是对Ken White将问题标记为重复的答复。 –

回答

1

为了实现你的愿望:

  1. 申报您的应用程序清单,你的程序是DPI感知。这将确保系统不会将您的程序扩展为窗口组合机制的一部分。
  2. 将每种表格的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认识是很重要的。否则,如果您只声明系统DPI意识,那么您仍然可以发现窗口由窗口组合机制缩放。

最后,如果您使用的是西雅图或更高版本,它本身支持每台显示器的DPI识别功能,则需要禁用该功能。这应该足以覆盖WM_DPICHANGED消息为每个顶层窗口的处理,并根据这一消息做什么:

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; 
+0

谢谢你,我已经试过这个,只能希望这个工作,因为我还没有能够测试它。 –

+0

谢谢你,我已经试过这个,只能希望这个工程,因为我还没有能够测试它。 –

相关问题