Scroll 高效绘画

Scroll 高效绘画,scroll,paint,wtl,bitblt,gdi,Scroll,Paint,Wtl,Bitblt,Gdi,使用从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,

使用从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不会将cpaitdc传递给派生类OnPaint,该派生类具有PAINTSTRUCT m_ps成员和update 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;
}
LRESULT CScrollImpl::OnPaint(UINT、WPARAM、WPARAM、LPARAM、BOOL&){
T*pT=静态施法(本);
ATLASSERT(::IsWindow(pT->m_hWnd));
如果(wParam!=NULL){//有时会传入HDC
CDCDHandle dc=(HDC)wParam;
SetViewportOrg(-m_ptOffset.x,-m_ptOffset.y);
pT->DoPaint(直流);
}
否则{
CPaintDC dc(pT->m_hWnd);
SetViewportOrg(-m_ptOffset.x,-m_ptOffset.y);
pT->DoPaint(CDCANDLE(dc));
}
返回0;
}
因此,我已经处理了WM_PAINT消息,到目前为止,我取得的最好成绩是在滚动时对整个_MemDC进行BitBlt,但在未滚动的重画过程中,仅对无效矩形进行BitBlt

更新:


有时rcPaint比MemDc的矩形大,因此效率的提高可以忽略不计,而且很麻烦

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

该示例对整个图像执行BitBlt,即使它比滚动视图大。即使操作系统将对其进行剪裁,从应用程序的角度来看,不在update rect之外执行BitBlt也更有意义。如果记录的此代码--
CBitmapView::DoPaint
被更新为blit only visible part,则示例将得到改进,并将更有效地使用
CScrollWindowImpl
。。。