【问题标题】:WTL ScrollWindow efficient paintingWTL ScrollWindow 高效绘图
【发布时间】:2017-08-10 03:45:25
【问题描述】:

使用从 CScrollWindowImpl 派生的类

  void Scroll::DoPaint(CDCHandle hDC)
    {
        if ( _MemDC==NULL)
            return;
        RECT r;

//I'd like to update r with rcPaint from the DC's PAINTSTRUCT here

        hDC.BitBlt(r.left, r.top, r.right-r.left, r.bottom-r.top,
            *_MemDC, r.left, r.top, SRCCOPY);
    }

用 WTL ScrollWindow 绘制窗口内容最有效的方法是什么?

CScrollImpl WM_PAINT 不会将 CPaintDC 传递给派生类 OnPaint,后者具有 PAINTSTRUCT m_ps 成员和更新 RECT rcPaint 成员。

LRESULT CScrollImpl::OnPaint(UINT, WPARAM wParam, LPARAM, BOOL&) {
    T* pT = static_cast<T*>(this);
    ATLASSERT(::IsWindow(pT->m_hWnd));
    if(wParam != NULL) { // The HDC is sometimes passed in
        CDCHandle dc = (HDC)wParam;
        dc.SetViewportOrg(-m_ptOffset.x, -m_ptOffset.y);
        pT->DoPaint(dc);
    }
    else {
        CPaintDC dc(pT->m_hWnd);
        dc.SetViewportOrg(-m_ptOffset.x, -m_ptOffset.y);
        pT->DoPaint(CDCHandle(dc));
    }
    return 0;
}

所以我已经处理了 WM_PAINT 消息,到目前为止我取得的最好成绩是在滚动时 BitBlt 整个 _MemDC,但在未滚动重绘期间仅 BitBlt 无效矩形。

更新:

有时 rcPaint 比 MemDc 的矩形大,因此效率的提高可以忽略不计且有问题。

【问题讨论】:

    标签: scroll paint wtl bitblt gdi


    【解决方案1】:

    它是否真的是最有效的,但是请注意,WTL 示例包括 Samples\BmpView 项目,该项目具有 CScrollWindowImplCBitmapView 类中的使用,它显示 [supposedly large] 图像的可见部分。具体来说,它会覆盖背景擦除和绘制处理程序,并演示如何仅对请求的绘制部分执行BitBlt

    【讨论】:

    • 该样本对整个图像进行 BitBlt,即使它大于滚动视图。即使操作系统会剪辑它,从应用程序的角度来看,在更新矩形之外不使用 BitBlt 会更有意义。
    • 你是对的,样本完全破坏了它。如果此代码(用于记录的CBitmapView::DoPaint)已更新为仅对可见部分进行 blit,则该示例将得到改进,并且可以更有效地使用 CScrollWindowImpl...
    猜你喜欢
    • 1970-01-01
    • 2012-09-20
    • 1970-01-01
    • 2012-09-27
    • 2013-06-28
    • 2013-02-16
    • 1970-01-01
    • 1970-01-01
    • 2013-03-16
    相关资源
    最近更新 更多