首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WTL ScrollWindow高效涂装

WTL ScrollWindow高效涂装
EN

Stack Overflow用户
提问于 2017-03-18 16:30:13
回答 1查看 255关注 0票数 1

具有从CScrollWindowImpl派生的类

代码语言:javascript
复制
  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,该类具有带有更新RECT rcPaint成员的PAINTSTRUCT m_ps成员。

代码语言:javascript
复制
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消息,到目前为止,我所取得的最好结果是滚动时的整个_MemDC,但是在一个未滚动的重绘过程中,只对失效的矩形进行BitBlt。

更新:

有时rcPaint比MemDc的长方形大,所以效率的提高是可以忽略的,而且是有缺陷的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-24 16:44:03

它是否真的是最有效的,但是请注意,WTL示例包括Sample\BmpView项目,该项目以CScrollWindowImplCBitmapView类中的使用为特色,它显示了据称较大的图像的可见部分。具体来说,它覆盖背景擦除和绘制处理程序,演示如何为只绘制部件的请求执行BitBlt

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42876925

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档