不要在 mfc 中更改相对于 windows dpi 的对话框字体?

Posted

技术标签:

【中文标题】不要在 mfc 中更改相对于 windows dpi 的对话框字体?【英文标题】:Don't change the font of dialog with respect to windows dpi in mfc? 【发布时间】:2014-03-14 07:17:44 【问题描述】:

我有一个 (355,99) 尺寸的对话框,它只有一个菜单和任务栏,所以它的尺寸很小。它的显示在 100% dpi 下很好,但在 125% dpi 上,一些任务控件被切断。如何在以下函数中根据 dpi 缩放它们

void CMainFrame::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)

   CMDIFrameWnd::OnGetMinMaxInfo(lpMMI);
   lpMMI->ptMinTrackSize = CPoint(355,99); // set minimum size  

【问题讨论】:

显然您从不想要对像素数量进行硬编码。对话框很特殊,它们不使用像素值,而是使用对话框单位。使用 MapDialogRect() 进行转换。 如何使用 MapDialogRect()?能给我举个例子吗? 【参考方案1】:

我自己找到了解决方案,因此我将其发布以帮助他人。对于我的问题,我找到了系统的 dpi 并相应地设置了对话框大小。 这是我的代码:

  void CMainFrame::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)  
  
      CMDIFrameWnd::OnGetMinMaxInfo(lpMMI);
      HDC hdcScreen = ::GetDC(NULL);
      int iDPI = -1; // assume failure
      if (hdcScreen) 
      
          iDPI = ::GetDeviceCaps(hdcScreen, LOGPIXELSX);
          ::ReleaseDC(NULL, hdcScreen);
       
       switch(iDPI)
       
          case 96:
              lpMMI->ptMinTrackSize = CPoint(355,99);
              break;
          case 120:
              lpMMI->ptMinTrackSize = CPoint(360,115);
              break;
          case 144:
            lpMMI->ptMinTrackSize = CPoint(365,134);
            break;
           case 196:
             lpMMI->ptMinTrackSize = CPoint(370,150);
             break;
            default:
              lpMMI->ptMinTrackSize = CPoint(355,99);
              break;

        
    

【讨论】:

以上是关于不要在 mfc 中更改相对于 windows dpi 的对话框字体?的主要内容,如果未能解决你的问题,请参考以下文章

在 MFC 中捕获鼠标指针形状更改事件

如何在 mfc 中更改 CImage 对象的背景颜色?

如何使用 MFC 以编程方式更改 ActiveX 控件的属性?

mfc dialog 尺寸无法固定控件位置如何确定?

.NET 等效于 MFC 函数 SetModifiedFlag

[MFC]透明图展示