【发布时间】: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