边界 导弹 兵器知识:Windows 7 高 DPI

来源:百度文库 编辑:偶看新闻 时间:2024/05/02 10:04:15
高 DPI - 本机(动手实验)
概述
只有约 55 %的用户实际设置的显示器的最大分辨率 . 大多数用户使用低分辨率,因为在高分辨率下看到的文字比较小 . 但是 , 减少了一些分辨率带来的负面影响 , 包括 :
ClearType 不提供正确的非本地的分辨率
用户无法在精确的内容下看到高分辨率的内容
高分辨率的照片,在这些情况下不能提供的最高保证度
为了提高文字的大小 , 鼓励用户增加 DPI 设置要显示在他们的高逼真度的优势 , 而不是降低分辨率 , 会受到负面影响 . 但是 , 虽然这解决了与高保真流失的问题 , 应用程序在没有 DPI 感知的情况下经常有一些不合适的效果 , 您以后会遇到此模块 .
随着 Windows 7 的发行 , 将更大程度的采用高 DPI ,理由如下 :
更多的 OEM 厂商预计将开始销售高 DPI 设置配置的笔记本电脑
Windows 7 的清洁功能的设备安装已预先配置为高 DPI
用户界面的控制面板的高 DPI 是容易找到
添加高 DPI 的支持对您的应用程序比以往更重要 . 下面的练习需要一个基本的 Win32 应用程序,并且告诉你如何使 DPI 感知 .
目标
在本次实验中 , 您将学习如何 :
确保计算机处于高 DPI 模式
比较在 144 DPI 和 96 DPI 下设置的用户界面元素
标记为应用程序 DPI- 感知
缩放按钮大小及布局
缩放窗口大小,使用默认的主题文字文本的 API
系统要求
您需要拥有以下程序才能完成实验 :
Microsoft Visual Studio  2008
Windows 7
练习 #1: 确保计算机是在高 DPI 模式
在练习中 , 确保您计算机运行 windows 7 是设置在 144 的高 DPI 模式 . 为了避免注销和登陆进程 , 在练习当中您不能对 DPI 进行任何的更改设置 .
Task 1: 检查计算机是否设置 144 DPI
1. 打开开始菜单在 , 单击控制面板
2. 在控制面板的右上角的检索文字框里 , 输入显示 , 和一个搜索列结果展现出来 , 如下面屏幕快照 :
3. 单击显示 , 您将会看到一个对话框如下图 , 较大的 – 150% 单选按钮 ( 如果不是 , 请选择它 ).
这表明,该单元的计算机被设置为 144 DPI, 因为 150% 正常的 DPI (96 DPI) 相当于 144 DPI.
练习 #2: 运行在应用程序设置 144DPI
在本次练习中 , 运行在 144 DPI 设置应用程序,然后比较 UI 元素的 96 DPI 设置的 .
任务 1: 运行在应用程序设置 144DPI
1. 在 Visual Studio 2008 中 , 打开解决方案 HighDPIApp.sln.
2. 把 HighDPINativeApp 设置为启动项 .
3. 在生成菜单中 , 单击 生成解决方案 .
4. 在调试菜单中 , 单击 开始调试 .
显示应用程序 , 如下图 :
任务 2: 比较在 144DPI 的 UI 设置的 96 DPI 设置
下面截图显示了在设置 96 DPI 后如何运行应用程序界面
1. 现在从 144 DPI 设置比较此用户界面的 UI :
下表总结了 144DPI 应用程序界面设置的外管比较,在 96 DPI 设置 .
UI 元素在144 DPI 外观
窗体大小
较大
按钮大小
较大
文本大小
较大
按钮上缺少的文本

窗口上缺少的文本

模糊效果

帮助
请注意 , 应用程序模糊 , 文本被截断按钮大小和窗体的增强 和按钮与窗口的增加 . 这是因为应用程序是默认的不缩放由 DPI 提供的虚拟化 .
DPI 设置为 114, 操作系统自动启动 DPI 虚拟化 , 微软推出了 Windows Vista 虚拟化 DPI 的概念 . 它被称为 DPI 扩展 , 这意味着文字的比例和应用程序的窗口大小不是 DPI 感知 .
当您的应用程序依赖在 DPI 虚拟化缩放该 UI 元素 , 它会产生因与 DPI 缩放不兼容的视觉效果 . 在前面的示例表明。要解决该问题,您需要退出,声明您作为 DPI 感知的应用程序 .
您已部署的应用程序 , 可以手动选择退出自动 DPI 虚拟化 . 如需要更多执行此操作的信息 , 参阅附录 : 手动选择退出 DPI 虚拟化 .
练习 #3: 应用程序标记 DPI- 感知
在本练习中 , 应用程序标记 DPI 感知选择 DPI 进行虚拟化处理 . 为此 , 首先添加 DPI- 感知进入应用 . 这个清单项告诉 Windows 应用程序 DPI 感知 , 因此 Windows 禁用 DPI 虚拟化 . 运行应用程序 , 比较 144DPI 设置的 UI 元素再对比 96DPI 的设置 , 最后记录 UI 问题 .
在此练习中 , 将继续使用之前的项目文件 .
任务 1: 在应用程序添加 DPI- 感知清单项
1. 在 Visual Studio 项目菜单 , 单击 HandsOnLab 属性 .
2. 在 HandsOnLab 属性页对话框 , 展开配置属性 , 展开清单工具 , 然后 单击 Input  and  Output.
3. 在右窗格 , 在附加清单文件文本框 , 类型 DeclareDPIAware.manifest, 如下图 , 单击 OK.
帮助
此模块包含一个名为 DeclareDPIAware.Manifest 的项目文件 . 以下是文件内容 :
XML



true



4. 重新编译并运行应用程序 . 应用程序如下图显示 :
任务 2: 比较在 144DPI 和 96DPI 设置的用户界面
下表显示了在应用程序的用户界面比较 144DPI 设置的 UI 元素再对比 96DPI 的设置。请注意,清单项添加到应用程序禁用 DPI 虚拟化,从而修正了模糊的问题,保持窗口和按钮,截至 96 DPI 设置相同大小 .
UI 元素144 DPI 外观
窗体大小
相同
按钮大小
相同
文本大小
较大
按钮上缺少的文本

窗口上缺少的文本

模糊效果
不变
练习 #4: 修复按钮的大小和布局
在本练习中 , 您修复按钮大小和布局 . 为此 , 比例从原始像素按钮的大小,适当地相对像素显示文字大小 , 然后比例从原始像素按钮的布局相对固定像素的按钮布局 .
对于此练习,继续使用以前的项目文件 .
任务 1: 按钮大小比例
1. 打开 the HandsOnLab.cpp 文件 . 在 DemoApp::CreateChildWindows 方法 , 找到其中部分指定按钮初始化 .
2. 添加下述代码(以粗体显示)按比例设置三个按钮的大小 :
C++
// Now set up the size of the buttons that we will create.
SIZE buttonSize = { 60, 26 };
g_metrics.ScaleSize(&buttonSize);
帮助
该 g_metrics 变量是 CDPI 类的一个实例 , 并从原始像素 g_metrics.ScaleSize 方法扩展到相对像素 .
3. 保存文件 , 重新编译 , 并运行应用程序 . 应用程序在下面的截图中可以看到 , 适当比例的按钮大小 :
任务 2: 缩放按钮布局
1. 在 DemoApp::CreateChildWindows 方法 , 添加下面代码 ( 以粗体显示 ):
C++
// Button 1 position.
POINT ptButton1Pos = { 10, 55 };
g_metrics.ScalePoint(&ptButton1Pos);
// Button 2 position is 75 pixels to the right of Button 1.
POINT ptButton2Pos = { 85, 55 };
g_metrics.ScalePoint(&ptButton2Pos);
// Button 3 is 75 pixels to the right of button 2.
POINT ptButton3Pos = { 160, 55 };
g_metrics.ScalePoint(&ptButton3Pos);
帮助
该 g_metrics.ScalePoint 方法 , 该 g_metrics.ScalePoint 方法尺度的像素点的相对像素 .
保存文件 , 重新编译 , 并运行应用程序 . 应用程序在下面的截图中可以看到 , 适当比例的按钮大小和布局 :
练习 #5: 修复窗口大小和文本截断
在本次学习中 , 您修复窗口的大小和截断的文字 . 为此 , 窗口大小比例到当前 DPI 设置,然后使用默认主题的文本修复被截断的文字 . 窗口比例适当 , scaleX 和使用的 CDPI 类 ScaleY 函数转换的像素,像素的相对比例的窗口大小到当前 DPI 设置 .
在此练习中 , 将继续使用之前的项目文件 .
任务 1: 窗口属性比例
1. 在 DemoApp::Initialize 函数 , 找到叫 CreateWindow 函数 , 然后确保 X 和 Y 传递的参数是通过使用规模分别 g_metrics.ScaleY 和 g_metrics.ScaleY 方法,如下面的代码所示粗体 .
C++
// Create window.
m_hwnd = CreateWindow(
TEXT("HighDPIDemoApp"),
TEXT("High DPI Demo App"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
g_metrics.ScaleX(420),
g_metrics.ScaleY(200),
NULL,
NULL,
HINST_THISCOMPONENT,
this
);
任务 2: 替换 TextOut 与默认主题文本的 API
1. 在 DemoApp::OnRender 方法 , 注释掉 TextOut 函数调用 .
2. 取消注释代码的主题文本图样 . 当您完成,代码应如下所示:
C++
// TextOut(ps.hdc, rcText.left, rcText.top, szText, lstrlen(szText));
// This is the recommended way of using the theme API to draw text.
// You will un-comment this during the exercise to see how to draw
// properly themed text.
OffsetRect(&rcText, g_metrics.ScaleX(8), g_metrics.ScaleY(8));
HTHEME hTheme = OpenThemeData(hWnd, VSCLASS_TEXTSTYLE);
if (hTheme)
{
DrawThemeText(hTheme, ps.hdc, TEXT_BODYTEXT,
0, szText, -1, DT_SINGLELINE, 0, &rcText);
CloseThemeData(hTheme);
}
else
{
// Visual styles are not enabled.
DrawText(ps.hdc, szText, -1, &rcText, DT_SINGLELINE);
}
3. 保存文件 , 重新编译 , 并运行应用程序 , 应用程序界面出现的所有解决的问题 , 如下图 .
总结
在本单元中 , 您了解了为什么您应用程序的 DPI- 感知很重要,并完成了如下练习
您的应用程序标记为 DPI 感知使用清单项
测试在 144 DPI 设置应用
比较 144DPI 设置的 UI 元素再对比 96DPI 的设置
缩放按钮的大小和布局,缩放窗口大小,以及用于文本文字的默认主题的 API
为了使您的应用程序真正的高保真 DPI- 感知 , 您应该创建图像,多分辨率版本位图,图标和工具栏按钮 . 然后将有合理的比例在不同的显示分辨率下,而不必在模糊,或缩放相关模糊了小位图图像 . 有了这些高保真的优点 , 可以选择适当的位图上最接近当前 DPI 设置,然后在缩放,以适应精确设置 .