问题标签 [dpi-aware]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
287 浏览

delphi - Delphi形式的PixelsPerInch在调试和独立时不同?

我正在开发具有多显示器功能的每显示器 DPI 感知应用程序。如果窗体在监视器之间移动,则必须知道窗体的设计时 PixelsPerInch 以根据当前监视器 DPI 对其进行缩放。问题是我没有始终如一地得到 PixelsPerInch。在调试时,在表单的重写 Loaded 方法中,我得到了正确的 120 值。独立运行时,我得到 96(因此表格会更大)。我使用 Scaled 属性作为 false 并在 DoShow 中使用 ChangeScale 手动重新缩放(如有必要,还设置监视器索引/boundsrect)。然后在 WM_DPICHANGED 上,如果有的话,再次重新缩放(无论如何它在调试时不会发送,可能是因为 IDE)。一切看起来都很好,只是在独立运行时它更大。

为什么我得到不同的 PixelsPerInch 数字?或者我应该在什么时候请求它的设计时值?

我目前正在使用 XE7。使用标准 (?) win 10 清单,并在单元初始化的最开始调用 SetProcessDPIAwareness。我更喜欢这种方式,因此模糊窗口缩放也可以运行“/no_dpi_aware”。当然我可以硬编码“120”,但我不喜欢它。

0 投票
0 回答
1208 浏览

c++ - 每显示器 DPI 感知 MFC 组件

经过一番努力,我已将我的 MFC 应用程序从 begin 迁移Sytem DPI aware (High DPI aware)Per Monitor High DPI Aware. 我看到我使用过的 MFC 组件(如对话框、消息框等)仍然不是per-monitor-dpi aware,而是它们的行为仍然像它们一样system-dpi aware。现在随着 Windows DPI 虚拟化的消失,当我的机器的不同显示器具有不同的 DPI 缩放比例时,这些组件的显示效果会更差。

例如。
考虑 2 台显示器 M1(3840x2160,带有150% dpi scaling)和 M2(1280x1024,带有100% DPI scaling)。现在,当我的应用程序在 M2 上运行时,用于选择用于 M2 的颜色的对话框不适合它(早期的 Windows 操作系统由于 DPI 虚拟化而将其缩小)。

是否有任何从 Windows 8 开始引入的新的 MFC 组件,这些组件是 per-monitor-dpi 感知的?例如。一个DIALOGEX2而不是DIALOGEX

0 投票
2 回答
2041 浏览

mfc - 当 DPI 感知禁用或在 Win7 上运行时,MFC 图片控件更改大小

我在 Win10 中使用 VS2015 为我的朋友制作了一个 MFC 应用程序。它看起来像这样,这与资源编辑器中的完全相同。

这个.

但是当他在Win7的电脑上运行应用程序时,优化校准中的位图图像放大并覆盖了下面的一些文本框,看起来像这样。

这个.

经过我搜索并意识到这可能与DPI意识有关。我在 Manifest Tool 的属性页面中禁用了 DPI-Awareness 并重新构建。即使在 Win10 中运行,也会发生同样的事情。

这个

有人可以帮我解释一下原因并找到解决图像控件大小的方法吗?谢谢。

0 投票
1 回答
136 浏览

c# - 为什么我的 WinForms 在 [Design] 模式 VS2015 中显得很拥挤

我正在两台不同的 PC 上开发我的应用程序,它们都使用相同的安装程序安装了 Windows 10 和 Visual Studio 2015。当我在实验室 PC​​ 中打开我的一些 WinForms 时,WinForms 中包含的控件看起来都拥挤在一起(甚至相互重叠),这使我无法修改视觉效果。这仅在“设计模式”中发生。当我运行该应用程序时,所有表单都正确显示。请看附图中的区别在此处输入图像描述

这只发生在少数几种形式上,而不是全部。但是尽管比较了每个表单属性(包括为每个表单设置为“Font”的“AutoScaleMode”),我还是找不到原因。另一台 PC 在设计模式下 100% 正确显示所有表格。

可能的原因/解决方案是什么?

编辑这里讨论的解决方案在我的情况下也没有效果,而其他发帖人说他们的问题是通过改变他们的 PC 的 DPI 意识来解决的。

0 投票
0 回答
251 浏览

c# - DPI 感知清单未嵌入

我已经尝试了所有可以想象的东西。我有一个 winform,它只是拒绝在我的 exe 清单中嵌入 DPIaware 设置。当我将 exe 复制到另一台机器上运行时,我必须复制清单,否则它将无法正确扩展。如果我在目标(复制到)机器上添加清单,一切都很好。如果我删除清单(从目标机器),我的应用程序无法自动缩放。

我已经在属性选项卡中选择了清单。我已经将清单设置为“嵌入式资源”。我已经尝试了所有我研究过的东西。没有任何效果。

哦,我怎样才能将清单(使用我的 DPIaware 设置)编译到 exe 中,这样我就不必每次都复制 exe.manifest?

清单选择

0 投票
1 回答
199 浏览

c# - 如何使用 C# 在 macOS 上创建高 dpi 控制台应用程序(如果可能的话)?

我有一个构建分形的简单 c# 控制台应用程序。我在 macOS 上使用 Visual Studio Community。我创建了一个特定大小(wxh)的位图。.SetPixel根据计算的 mandelbrotnumber,为每个像素分配一个颜色。

这很好用,除了我有一个高 dpi 的视网膜屏幕并且位图看起来非常像素化。

我试过这样的事情:

得到一个dpi,但这只是给我96,这是分辨率,而Form不是屏幕。

我在创建位图后直接尝试bm.SetResolution(144.0F, 144.0F);,没有成功。

我尝试了更复杂的方法,比如在这里找到的,但这只会使程序崩溃。可能(?)因为我在 macos 上,所有推荐的建议加载 .dll 的解决方案都[DllImport("user32.dll")]不起作用:System.DllNotFoundException: user32.dll

我尝试添加this.AutoScaleDimensions = new System.Drawing.SizeF(200F, 200F);到初始化Form.

即使切换到WPF似乎也是有问题的,如果在 macOS 上什至可能的话。想知道是否有可能使用 C#?

我不需要整个程序来渲染视网膜 dpi,但是逐像素创建位图可能需要另一种方法来获得高分辨率图像?简单地使位图更小,但分辨率更高是可以接受的。当然,最好的解决方案是Form根据屏幕的可用 dpi 在高 dpi 分辨率下使用几行代码创建完整的应用程序,而无需将整个应用程序重写为

.NET文档真的没用,所以希望这里有人有解决方案。

PS:与其只是对我的帖子投反对票,我更愿意听听对我帖子的批评。它是重复的吗?我很高兴听到我在哪里可以找到答案,已经搜索了几个小时。您需要更多代码吗?乐于提供...

0 投票
0 回答
320 浏览

c++ - 如何确定图标资源中包含的可用图标大小?

我正在经历让我的 MFC 应用程序 DPI 感知的痛苦过程。我计划包含包含不同图标大小的图标资源。例如,列表视图控件的小图标应采用 Microsoft 推荐的尺寸:16x16、20x20、24x24 等。

我知道我可以使用LoadImage()(甚至LoadIconWithScaleDown())加载所需大小的图标,如下所示:

如文档的备注部分所述LoadIconWithScaleDown(),如果图标大小不可用,则将LoadImage()较小的图标放大并LoadIconWithScaleDown()缩小较大的图标。但是,根据大卫赫弗南的这个回答,我应该尽量避免缩放图标(至少是小图标):

[...] 例如,如果系统指标建议使用 18px 图标,而您只有 16px 和 20px 图标,则制作一个新的 18px 图标。用透明像素填充图像,并将 16px 图标 blit 到这个 18px 图像的中间。从中制作图标。[...]

我想这样做,但出于稳健性的原因,我不想对可用的图标大小做出任何假设。因此,我想在运行时动态确定图标资源的可用图标大小。但是,我发现的图标功能似乎都没有提供这种功能。

如何找出我的图标资源中可用的图标大小(例如IDI_MYICON)?

0 投票
2 回答
521 浏览

vcl - VCL 表单中 PageControl 上带有锚点的错误自动缩放控件

我在表单上针对不同显示器 DPI 设置自动缩放控件时遇到问题。Rad Studio 10.2 东京。“启用高 dpi”已打开。我在设计时将表单的 PixelsPerInch 设置为 96。我将 TPageControl 放在一个窗体上,在其中创建一个 TTabSheet 页面,将一些控件放在一个页面上并将它们的 Anchor 属性设置为 akRight(除了 akLeft 和 akTop)。当程序在分辨率为 120 DPI 的监视器上运行时,这些控件的右边缘出现延伸超出 PageControl 的右边界,因此控件的右侧部分不可见。如果我关闭 akRight,则控件的缩放比例正确。但我需要这些锚在运行时正确调整表单大小。如何解决问题?

PS 该错误已在 Rad Studio 10.3 中修复

0 投票
1 回答
581 浏览

c++ - Winapi在不同机器上的缩放

几个星期以来,我一直在尝试使用 winapi(无 MFC)设计一个小界面,但有一个问题我无法解决。我的窗口的创建以像素为单位指定,但我的控件的大小以逻辑单位为单位。

我认为解决方案是在MulDiv为窗口创建字体时使用该功能:

通常我用 MSVC2010 编译代码,但是这个最小的例子是用 gcc 7.2.0(MinGW 64 位)编译的。这适用于我的计算机,也可以使用 Windows 10 的缩放设置。但是,我注意到在某些计算机中文本看起来更大。我只是无法获得一个带有控件的窗口来保持窗口和所有测试机器上的元素之间的比率。我的应用程序不支持 DPI,因此每个元素都应该以相同的方式缩放,但每个 Edit 和 Static 控件似乎都违反了我要求的 16pt 字体。

使用winapi获得比率保持窗口的正确方法是什么?

这是发生的事情的一个例子。正确的图片是它在我的机器上的样子(更改缩放比例确实缩放了整个窗口,并且它保留了字体和窗口之间的比例),右边是运行相同程序的戴尔计算机(更改缩放参数不会修改任何内容,整个窗口被缩放,但文本看起来仍然很糟糕)。 正常情况 严重缩放的情况

谢谢你。

0 投票
0 回答
534 浏览

c# - 具有 Hi DPI 的远程桌面上的 WPF 应用程序“位图缩放”

我的 WPF 应用程序在 Hi-DPI 显示器上运行良好(例如,我的 Yoga Pro 2 笔记本电脑,具有 192 DPI 显示器(13 英寸,3200x1800)。所有矢量定义的 GUI 元素都清晰锐利 - 没有任何明确的编程。似乎 WPF可以选择合适的渲染 DPI 匹配显示器的 DPI 并自动一切正常。只要程序在本地运行。

但是,当在远程桌面上运行相同的应用程序时,(使用“增强”桌面模式连接到本地虚拟机)- 应用程序以 96 DPI 呈现,并放大两次以具有适当的大小。问题是这种缩放是位图缩放,自然会产生模糊/像素化的外观。

我相信这应该很容易声明一些东西,以使应用程序在 RDP 上以高 DPI “本地”呈现,而无需事后(无论如何由系统)对其进行缩放以使其达到预期的大小。

我试图在 app.manifest 中设置为 true 但是,它并没有解决问题......

有任何想法吗 ?

顺便说一句 - 其他应用程序(例如,Windows 资源管理器可以在 RDP 上以适当的 DPI 渲染,而无需稍后放大以匹配自然大小(注意:在高 DPI 上,如果不是以高 dpi 本地渲染,一切看起来都很小)。

我已将问题隔离到一个空白的WPF 应用程序,只显示一个 TextBlock。此应用程序在 RDP(Windows 10 Creators 版本或更高版本)上运行时可轻松用于重现问题(文本大小合适,但按位图缩放(作为整个应用程序放大的一部分))。

谢谢,迈克尔