wxHtmlDCRenderer宽度计算异常导致h4标签文本强制换行问题求助
我使用wxHtmlDCRenderer在框架上输出渲染后的HTML文本,使用的HTML内容如下:
<h4>Anderson-Darling Test</h4> <p>p-value: 0.958<br> A<sup>2</sup>: 0.13</p>
由于wxHtmlDCRenderer需要提前设置宽高参数,我编写了如下代码计算HTML文本渲染后的尺寸:
wxSize GetHTMLTextSize(wxWindow* window, const wxString& HTMLText, double PixelScaleFactor, double FontScaleFactor) { wxClientDC dc(window); wxHtmlWinParser parser; parser.SetDC(&dc, PixelScaleFactor, FontScaleFactor); auto HTMLCell = (wxHtmlCell*)parser.Parse(HTMLText); int w = window->GetSize().GetWidth(); HTMLCell->Layout(w); int MaxWidth = HTMLCell->GetMaxTotalWidth(); int Width = HTMLCell->GetWidth(); return wxSize(MaxWidth, HTMLCell->GetHeight()); }
实际在设备上下文上渲染HTML的代码如下:
void CHTMLTextBox::RenderHTML(wxDC* dc) { double ScaleFactor = m_ParentWindow->GetDPIScaleFactor(); if (m_Size == wxSize()) m_Size =sys::util::GetHTMLTextSize(m_ParentWindow, m_HTMLText, ScaleFactor, ScaleFactor); //wxHtmlDCRenderer might change the user scale of DC double OldUsrScale_X, OldUsrScale_Y; dc->GetUserScale(&OldUsrScale_X, &OldUsrScale_Y); wxHtmlDCRenderer htmlDC; htmlDC.SetDC(dc, ScaleFactor, ScaleFactor); htmlDC.SetSize(m_Size.GetWidth(), m_Size.GetHeight()); htmlDC.SetHtmlText(m_HTMLText); htmlDC.Render(m_StartPoint.x, m_StartPoint.y); int totalHeight = htmlDC.GetTotalHeight(); int totalWidth = htmlDC.GetTotalWidth(); //not sure if the following two lines needed at all?? htmlDC.SetSize(totalWidth, totalHeight); htmlDC.Render(m_StartPoint.x, m_StartPoint.y); m_Size = wxSize(totalWidth, totalHeight); //restore user scale back dc->SetUserScale(OldUsrScale_X, OldUsrScale_Y); }
当前HTML文本本身渲染正常,高度计算结果准确,但宽度计算存在异常:如下图所示,以h4标签开头的文本无法在同一行完整展示,被强制拆分换行。
运行环境为Windows 10、wxWidgets 3.1.4、VS 2019。
修复方案
这个问题的核心是宽度计算逻辑错误,可按以下步骤调整:
- 修改尺寸计算的布局宽度参数
你当前给HTMLCell->Layout()传的是父窗口的宽度,要是父窗口宽度小于文本实际需要的宽度,布局时就会自动触发折行,拿到的MaxWidth是折行后的宽度,不是文本真正需要的最小宽度。把int w = window->GetSize().GetWidth();改成int w = 99999;,传入一个远大于常规文本宽度的数值,强制布局时不折行,就能拿到文本真实需要的最大宽度。 - 移除冗余的二次渲染代码
你注释里不确定是否需要的SetSize和第二次Render调用是多余的,反而会导致已经完成布局的内容重新适配尺寸,触发不必要的折行,直接删除这两行即可。 - 消除默认样式的宽度影响
wxHTML渲染器会给h4、p这类块级元素添加默认的内外边距,会导致计算宽度和实际渲染宽度有偏差,可以在HTML内容开头添加样式取消默认边距:
<style>h4,p{margin:0;padding:0}</style>
- 校验缩放参数一致性
确认尺寸计算和实际渲染时传入的PixelScaleFactor、FontScaleFactor完全一致,避免高DPI场景下缩放倍数不匹配导致的宽度计算误差。
内容的提问来源于stack exchange,提问作者macroland
相关产品推荐
相关产品推荐

