Vista 避免畫面元素難以閱讀,可用SetProcessDPIAware()防止

Windows Vista 允许用户更改每英寸点数 (dpi) 设置,以使屏幕上的大多数用户界面 (UI) 元素显示得更大。虽然 Microsoft Windows 中早已提供了此功能,但是,在早期版本中,缩放必须由应用程序实现。在 Windows Vista 中,对于无法自行缩放的所有应用程序,桌面窗口管理器将对其执行默认缩放。UI 自动化客户端应用程序必须考虑到此功能。

 

默认的 dpi 设置是 96,这意味着一名义英寸的宽度或高度上有 96 个像素。“一英寸”的确切度量大小取决于监视器的大小和物理分辨率。例如,在一台 12 英寸宽的监视器上,如果水平分辨率为 1280 像素,则一条 96 像素水平线条的长度约为 9/10 英寸。

更改 dpi 设置与更改屏幕分辨率不同。对于 dpi 缩放,屏幕上的物理像素数保持不变。但是,缩放将应用到 UI 元素的大小和位置。桌面窗口管理器 (DWM) 可以自动对桌面和未显式要求不进行缩放的应用程序执行此缩放。

实际上,如果用户将缩放系数设置为 120 dpi,则屏幕上的一个垂直或水平英寸将增大 25%。所有维度都相应地进行缩放。应用程序窗口在屏幕的上边缘和左边缘的偏移量增大 25%。如果启用了应用程序缩放而应用程序不识别 dpi,则窗口大小及其包含的所有 UI 元素的偏移量和大小按相同比例增大。

 

屏幕缩放为以任何方式与屏幕坐标相关的应用程序带来了新的挑战。屏幕现在包含两个坐标系:物理和逻辑。点的物理坐标是距离原点左上方的以像素为单位的实际偏移量。逻辑坐标是像素本身经过缩放后将出现的偏移量。

假定您要设计一个对话框,该对话框的某个按钮位于坐标 (100, 48)。在以默认的 96 dpi 显示此对话框时,该按钮的物理坐标为 (100, 48)。在 120 dpi 时,它的物理坐标位置是 (125, 60)。但是,无论采用哪种 dpi 设置,逻辑坐标都是相同的,即 (100, 48)。

逻辑坐标非常重要,因为逻辑坐标在任何 dpi 设置下都使操作系统和应用程序的行为保持一致。例如,Cursor..::.Position 通常返回逻辑坐标。如果将光标移到对话框中的元素上,则无论 dpi 设置如何都返回相同的坐标。如果在 (100, 100) 绘制控件,则会根据逻辑坐标进行绘制,该控件在任何 dpi 设置下都占据相同的相对位置。

        但是某些API则会返回物理坐标,如:

  • GetClickablePoint

  • TryGetClickablePoint

  • ClickablePointProperty

  • FromPoint

  • BoundingRectangle

  •        可用SetProcessDPIAware()防止UI自动放大,代码如下:

     

         HINSTANCE hUser32 = LoadLibrary( L"user32.dll" );
        if( hUser32 )
        {
            typedef BOOL ( WINAPI* LPSetProcessDPIAware )( void );
            LPSetProcessDPIAware pSetProcessDPIAware = ( LPSetProcessDPIAware )GetProcAddress( hUser32,
                                                                                               "SetProcessDPIAware" );
            if( pSetProcessDPIAware )
            {
                pSetProcessDPIAware();
            }
            FreeLibrary( hUser32 );
        }

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值