字体的大小不跟随系统DPI的更改而改变的解决方案
2015-04-14 11:06
435 查看
已知要设定的字体大小为12pt,DPI -> 100%状态下(1inch = 96pixel)
要实现DPI更改为其他时字体的现实效果不变。
实现原理:
1)先求出DPI 100%状态下对应的pixel值
2)动态的求出当前的DPI,然后根据之前求出的pixel值转换到合适twips单位的值。(richedit的字体是twips单位的)
实现步骤:
0)先来看下以下几个要用到的函数
BOOL GetDPI(UINT &dpi, BOOL bIsHeightPx = TRUE);
void PointToPixel(FLOAT pt, UINT dpi, FLOAT &px);
BOOL PixelToTwips(FLOAT px, FLOAT &twips);
函数的实现请看最后
1)我们需要先求出DPI 100%状态下对应的pixel值:
FLOAT px;
PointToPixel(12, 96, px);
2)我们要动态的求出当前的DPI,然后根据之前求出的pixel值转换到合适twips单位的值:
FLOAT twips;
PixelToTwips(px, twips);
3)Ok了 twips就是你要设置的richedit的字体的大小。
下面是我写的一些px ,pt,twips的装换相关函数:
函数定义 DPIAction.h
#include <Windows.h>
#include <tchar.h>
BOOL GetDPI(UINT &dpi, BOOL bIsHeightPx = TRUE);
BOOL PointToPixel(FLOAT pt, FLOAT &px);
void PointToPixel(FLOAT pt, UINT dpi, FLOAT &px);
BOOL PixelToPoint(FLOAT px, FLOAT &pt);
void PixelToPoint(FLOAT px, UINT dpi, FLOAT &pt);
BOOL PixelToTwips(FLOAT px, FLOAT &twips);
void PixelToTwips(FLOAT px, UINT dpi, FLOAT &twips);
函数实现:DPIAction.cpp
#include "DPIAction.h"
TCHAR tszDebug_DPI[MAX_PATH] = {0};
BOOL GetDPI(UINT &dpi, BOOL bIsHeightPx)
{
HDC hdc = GetDC(NULL);
if (hdc == NULL)
{
_stprintf_s(tszDebug_DPI, MAX_PATH, TEXT("GetDPI ->GetDC failed at %d\r\n"), GetLastError());
OutputDebugString(tszDebug_DPI);
return FALSE;
}
if (bIsHeightPx)
{
//Number of pixels per logical inch along the screen width.
dpi = GetDeviceCaps(hdc, LOGPIXELSY);
}
else
{
//Number of pixels per logical inch along the screen height.
dpi = GetDeviceCaps(hdc, LOGPIXELSX);
}
}
BOOL PointToPixel(FLOAT pt, FLOAT &px)
{
UINT dpi;
if (!GetDPI(dpi))
{
return FALSE;
}
px = pt*dpi/72;
return TRUE;
}
void PointToPixel(FLOAT pt, UINT dpi, FLOAT &px)
{
px = pt*dpi/72;
}
// px to pt
BOOL PixelToPoint(FLOAT px, FLOAT &pt)
{
UINT dpi;
if (!GetDPI(dpi))
{
return FALSE;
}
pt = px*72/dpi;
return TRUE;
}
void PixelToPoint(FLOAT px, UINT dpi, FLOAT &pt)
{
pt = px*72/dpi;
}
// px to twips
BOOL PixelToTwips(FLOAT px, FLOAT <wips)
{
UINT dpi;
if (!GetDPI(dpi))
{
return FALSE;
}
ltwips = px*1440/dpi;
}
void PixelToTwips(FLOAT px, UINT dpi, FLOAT <wips)
{
ltwips = px*1440/dpi;
}
相关文章推荐
- 记录一下,APP不跟随系统的字体大小改变而改变
- WinForm的自动缩放(跟随系统字体大小的改变)
- 处理APP字体跟随系统字体大小改变的问题
- Android APP字体大小跟随系统设置
- Win10高分屏笔记本更改DPI后软件界面字体变模糊的解决方案之一
- 如何设置android app 的字体大小不受系统字体大小改变的影响
- Android 兼容8.0 App全局字体调节、禁止App字体随系统字体大小而更改
- Android中sp使用问题及字体大小跟随系统设置
- Android设置App字体不跟随系统字体大小变化
- 保持app的字体大小不随系统设置而改变
- 解决系统改变字体大小的时候导致的界面布局混乱的问题
- Android 应用运行期间系统配置(系统语言、字体大小等)改变引发的问题修改
- ios - 可以改变系统弹框字体大小以及颜色的方法
- Android解决系统改变字体大小的时候导致的界面布局混乱的问题
- 如何设置android app 的字体大小不受系统字体大小改变的影响
- android随字体随系统大小改变
- 默认(1sp = 1dp) , sp:带缩放的dp(手动改变系统字体大小)
- 解决系统改变字体大小的时候导致的界面布局混乱的问题
- android开发中使用sp为字体单位,调整系统字体大小后影响布局的解决方案
- 安卓设置更改系统字体大小,影响App展示