MFC程序,改变系统DPI后界面错位问题的处理
2014 年 8 月 7 日 MFC程序,改变系统DPI后界面错位问题的处理无评论
MFC程序默认系统DPI96时调整的界面,在 【个性设置-显示-中等(win7, xp类似)】 后,出现控件错位的问题,是因为调整后DPI发生变化,相对的坐标也需要重新调整,修改方法如下:
1.调整函数的实现
#define DEFAULT_DPI 96.0
static int dpiX;
static int dpiY;
void moveWindow( CWnd &wnd )
{
CRect rect;
wnd.GetWindowRect(rect);
wnd.GetParent()->ScreenToClient(rect);
rect.left = (int)(rect.left*DEFAULT_DPI/dpiX);
rect.right = (int)(rect.right*DEFAULT_DPI/dpiX);
rect.top = (int)(rect.top*DEFAULT_DPI/dpiY);
rect.bottom = (int)(rect.bottom*DEFAULT_DPI/dpiY);
rect.OffsetRect(CPoint((int)((dpiX-DEFAULT_DPI)/2), (int)((dpiY-DEFAULT_DPI)/2)));
wnd.MoveWindow(rect);
}
void SetDPI( int x, int y )
{
dpiX = x;
dpiY = y;
}
int GetDPIX()
{
return dpiX;
}
int GetDPIY()
{
return dpiY;
}
static int dpiX;
static int dpiY;
void moveWindow( CWnd &wnd )
{
CRect rect;
wnd.GetWindowRect(rect);
wnd.GetParent()->ScreenToClient(rect);
rect.left = (int)(rect.left*DEFAULT_DPI/dpiX);
rect.right = (int)(rect.right*DEFAULT_DPI/dpiX);
rect.top = (int)(rect.top*DEFAULT_DPI/dpiY);
rect.bottom = (int)(rect.bottom*DEFAULT_DPI/dpiY);
rect.OffsetRect(CPoint((int)((dpiX-DEFAULT_DPI)/2), (int)((dpiY-DEFAULT_DPI)/2)));
wnd.MoveWindow(rect);
}
void SetDPI( int x, int y )
{
dpiX = x;
dpiY = y;
}
int GetDPIX()
{
return dpiX;
}
int GetDPIY()
{
return dpiY;
}
2.设置dpi
在程序第一个对话框初始化OnInitDialog()时,添加如下代码:
CDC* dc = GetDC();
int dpiX = GetDeviceCaps(dc->GetSafeHdc(), LOGPIXELSX);
int dpiY = GetDeviceCaps(dc->GetSafeHdc(), LOGPIXELSY);
SetDPI(dpiX, dpiY);
ReleaseDC(dc);
int dpiX = GetDeviceCaps(dc->GetSafeHdc(), LOGPIXELSX);
int dpiY = GetDeviceCaps(dc->GetSafeHdc(), LOGPIXELSY);
SetDPI(dpiX, dpiY);
ReleaseDC(dc);
如果有通过SetWindowPos函数设置的控件,需要进行比例转换,例如:
button.SetWindowPos(NULL,0,0,(size_t)(width/DEFAULT_DPI*dpiX),(size_t)(height/DEFAULT_DPI*dpiY),SWP_NOMOVE);
之后再调用函数moveWindow(CWnd &wnd)就可以进行坐标转换了。
Tags: dpi MFC 个性设置,显示,错位,高分屏 界面错位
发表评论