• DPI适配之实践篇


    获取当前系统的DPI缩放系数

    使用如下方法来获得当前缩放系数:

    
    float GetDPIFactor()
    {
    	static float s_fDPI = -1;
    	if (s_fDPI < 0)
    	{	
    		HDC hDC = ::GetDC(NULL);
    		s_fDPI = (float)GetDeviceCaps(hDC, LOGPIXELSX) / 96.0);
    		::ReleaseDC(NULL, hDC);
    	}
    	return s_nDPI;
    }
    
    #define MultiPlyDPI(nLen) (int((nVol)*GetDPIFactor()))
    
    

    对话框缩放

    对话框使用对话框字号来决定控件之间的布局,它们通常不需要进行特殊修改,就能在高DPI设备上工作。对话框本身的宽高,如果不手动设置的话,是会随着DPI缩放而缩放,一旦有手动设置,就不能简单写个数字,而是要乘以DPI缩放系数,保证在不同DPI下显示效果的一致。

    控件缩放

    控件缩放分为自身缩放以及相对位置缩放。

    • 自身缩放
      • 静态放置的控件,需要为额外分配一些宽度
      • 动态调整的空间,在调整位置和大小时,需要乘以DPI缩放因子
    • 相对位置缩放
      • 位于对话框内部的控件之间的相对距离,有直接在资源编辑器中拖拽的,也有通过程序来控制。对于后者来说,间距调整要考虑DPI缩放因子,对于前者,操作系统使用“对话框度量单位”布局,可通过 [GetDialogBaseUnits](https://docs.microsoft.com/en-us/previous-versions/aa931044(v=msdn.10)来获得。
        该度量单位是对话框资源中自带的,还没找到方法来修改它,对于这类情况,可在资源编辑器中预留适当间隔来满足不同DPI下的显示需求。

    字体创建

    在创建字体时,推荐使用磅来指定字号,磅是逻辑大小,而不是像素高度,创建方法如下:

    LOGFONT lf;
    memset(&lf, 0, sizeof(lf));
    lf.lfHeight = -(iPointSize * GetDeviceCaps(hdc, LOGPIXELSY)) / 72;
    HFONT font = CreateFontIndirect(&lf); 
    
  • 相关阅读:
    [BZOJ 1001] [BeiJing2006]狼抓兔子
    [BZOJ 1070] [SCOI2007] 修车
    [BZOJ 1834] [ZJOI2010]network 网络扩容
    [POJ 2135] Farm Tour
    [CodeFights] Changu Circle
    [Noip模拟赛] Power
    [Noip模拟赛] Polygon
    【学习】计算几何初步
    【学习】序列DP
    [BZOJ 2659] [Beijing wc2012] 算不出的算式
  • 原文地址:https://www.cnblogs.com/cherishui/p/13209798.html
Copyright © 2020-2023  润新知