主页 > 未分类 > MFC程序,改变系统DPI后界面错位问题的处理

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;
}

2.设置dpi
在程序第一个对话框初始化OnInitDialog()时,添加如下代码:

CDC* dc = GetDC();
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)就可以进行坐标转换了。

发表评论

邮箱地址不会被公开。 必填项已用*标注