为了实现你的愿望:
- 申报您的应用程序清单,你的程序是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认识是很重要的。否则,如果您只声明系统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;
请允许我不同意:该用户问“表现良好”。我甚至不知道他的意思。你认为他的意思是出现在相同的大小和位置,不管系统的DPI如何? –
只是为了说明问题:上述评论是对Ken White将问题标记为重复的答复。 –