您的位置:首页 > 其它

字体的大小不跟随系统DPI的更改而改变的解决方案

2015-04-14 11:06 435 查看



字体的大小会随着系统DPI的更改而变化。在此以MFC中窗口中有rich edit控件为例来说明如何来解决这个问题。

已知要设定的字体大小为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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C Plus