【问题标题】:Is there a performance improvements over using the GetDC approach instead of the others?使用 GetDC 方法而不是其他方法是否有性能改进?
【发布时间】:2020-04-19 13:50:07
【问题描述】:

使用此代码有什么好处:

CClientDC dc(nullptr);
HFONT hFont = (HFONT)m_StatusBar.SendMessage(WM_GETFONT);
HGDIOBJ hOldFont = nullptr;
if (hFont != nullptr)
    hOldFont = dc.SelectObject(hFont);
cxNewWidth = dc.GetTextExtent(strCalendar).cx + kStatusBarIconWidth;

或者这个代码:

CClientDC dc(nullptr);
CFont *pFont = m_StatusBar.GetFont();
if (pFont != nullptr)
    dc.SelectObject(pFont);
cxNewWidth = dc.GetTextExtent(strCalendar).cx + kStatusBarIconWidth;

或者:

CDC *pDC = m_StatusBar.GetDC();
cxNewWidth = pDC->GetTextExtent(strCalendar).cx + kStatusBarIconWidth;

【问题讨论】:

  • IDK, ... 也许在这里 IC 会比 DC 更好/更轻量级的选择,因为您只想查询一些信息?疾控中心直流; dc.CreateIC(_T("display"), NULL, NULL, NULL);但正如在其他地方评论的那样,这不太可能是您的性能瓶颈。如果是,您可能会考虑缓存该值以进行计算。

标签: c++ mfc statusbar


【解决方案1】:

第一个和第二个代码示例是相同的。 CWnd::GetFont 的文档解释了它是如何实现的:

向窗口发送 WM_GETFONT 消息以检索当前字体。

第三个代码 sn-p 与前面的不同之处在于它向控件查询设备上下文。 CWnd::GetDC 返回的内容取决于特定窗口类的注册方式。在最常见的情况下,它会返回“通用设备上下文”

对于常见的设备上下文,GetDC 会在每次检索上下文时为其分配默认属性。

换句话说,在这种情况下,您正在检索的设备上下文可能会或可能不会选择所需的字体。作为一般规则,您不应依赖其中选择了任何特定的图形对象。

没有任何操作本质上是昂贵的。您应该分析您的代码以找出它花费大部分时间的地方。发布的代码可能不会显示。

【讨论】:

    【解决方案2】:

    如果要检索m_StatusBar的客户端DC,那么

    CClientDC dc(m_StatusBar); 
    

    是正确的方法。这样,您已经在 DC 中选择了正确大小的位图,并且您应该也可以保存 GetFont()。 使用 ClientDC(nullptr); 检索某些顶级窗口的 DC,然后将 m_StatusBar 的字体选择到其中对我来说似乎是错误的。

    对于性能: GetDC() 方法在每次调用时都会分配一个新的 DC。因此,您必须为每个GetDC() 调用提供ReleaseDC()。 CClientDC 对象只是将GetDC()ReleaseDC() 包装在类构造函数和析构函数中。一方面这更方便,另一方面由于类实例的创建和销毁,ClientDC 方法的性能比直接使用GetDC()ReleaseDC() 稍差一点。然而,这是微不足道的。

    【讨论】:

      猜你喜欢
      • 2010-11-23
      • 1970-01-01
      • 1970-01-01
      • 2020-05-04
      • 2021-11-09
      • 1970-01-01
      • 1970-01-01
      • 2016-02-29
      • 1970-01-01
      相关资源
      最近更新 更多