关于duilib CMenuUI控件在高DPI时字体显示错误的问题

首先,使用menu控件时,菜单项的字体大小使用默认字体大小,且在高DPI缩放比时,会出现字体过度缩放的情况,
如下图为100%缩放比时:
在这里插入图片描述
其中,ui资源文件代码如下:



  
  
  
    
      
      
      
    
    
  

虽然再Default中已经确定了font=“0”,但是在创建菜单时,MenuElement 无法继承该属性,所以MenuElement 的font属性值为-1,在绘制文字时会获取带有default="true"属性的字体,之前有试验过在MenuElement 中添加font="0"属性,但是MenuElement 的font属性值依然为-1,这应该也是一个问题,暂时还没有研究为什么设置font属性后font属性值依然为-1。

依据上面的分析,创建菜单栏时,需要在CPaintManagerUI中添加字体信息,具体代码在UIMenu.cpp文件的CMenuWnd::OnCreate函数中,该函数调用了CDialogBuilder::Create函数,在CDialogBuilder::Create中,对Font属性值的解析是没有问题的,但是在设置默认字体属性时,调用CPaintManagerUI::SetDefaultFont函数时,传入的size值做了一次CDPI::Scale转换,此时将字体做了一次放大,而且此处放大的是字体大小,比如上面font="0"的字体大小时12,此处做了一次转换后,字体大小变为了18,之后再做绘制时系统根据字体大小为18进行绘制就会出现字体过大的问题。

下图是DPI为150%时的相识效果:
关于duilib CMenuUI控件在高DPI时字体显示错误的问题_第1张图片
可以看出,图中文字的显示比例明显比DPI为100%时要大的多。

问题代码摘录见下:

if( _tcsicmp(pstrClass, _T("Font")) == 0 ) {
					nAttributes = node.GetAttributeCount();
					int id = -1;
					LPCTSTR pFontName = NULL;
					int size = 12;
					bool bold = false;
					bool underline = false;
					bool italic = false;
					bool defaultfont = false;
					bool shared = false;
					for( int i = 0; i < nAttributes; i++ ) {
						pstrName = node.GetAttributeName(i);
						pstrValue = node.GetAttributeValue(i);
						if( _tcsicmp(pstrName, _T("id")) == 0 ) {
							id = _tcstol(pstrValue, &pstr, 10);
						}
						else if( _tcsicmp(pstrName, _T("name")) == 0 ) {
							pFontName = pstrValue;
						}
						else if( _tcsicmp(pstrName, _T("size")) == 0 ) {
							size = _tcstol(pstrValue, &pstr, 10);
						}
						else if( _tcsicmp(pstrName, _T("bold")) == 0 ) {
							bold = (_tcsicmp(pstrValue, _T("true")) == 0);
						}
						else if( _tcsicmp(pstrName, _T("underline")) == 0 ) {
							underline = (_tcsicmp(pstrValue, _T("true")) == 0);
						}
						else if( _tcsicmp(pstrName, _T("italic")) == 0 ) {
							italic = (_tcsicmp(pstrValue, _T("true")) == 0);
						}
						else if( _tcsicmp(pstrName, _T("default")) == 0 ) {
							defaultfont = (_tcsicmp(pstrValue, _T("true")) == 0);
						}
						else if( _tcsicmp(pstrName, _T("shared")) == 0 ) {
							shared = (_tcsicmp(pstrValue, _T("true")) == 0);
						}
					}
					if( id >= 0 ) {
						pManager->AddFont(id, pFontName, size, bold, underline, italic, shared);
						if( defaultfont ) pManager->SetDefaultFont(pFontName, pManager->GetDPIObj()->Scale(size), bold, underline, italic, shared);
					}
				}

duilib源码中的代码片段,其中最后一行代码就是上面分析的将字体大小做了一次放大的地方:

pManager->SetDefaultFont(pFontName, pManager->GetDPIObj()->Scale(size), bold, underline, italic, shared);

应该修改为

pManager->SetDefaultFont(pFontName, size, bold, underline, italic, shared);

修改后的显示效果见下图:
关于duilib CMenuUI控件在高DPI时字体显示错误的问题_第2张图片

你可能感兴趣的:(关于duilib CMenuUI控件在高DPI时字体显示错误的问题)