WTL雙緩衝類CDoubleBufferImpl的缺陷

來源:互聯網
上載者:User

WTL的雙緩衝類非常好用,但是要注意一點。這個DoPaint的重載函數中,只有傳遞給WM_PAINT中CPaintDC中的m_ps.rcPaint地區才能更新,其他地區將無法得到更新。這點需要瞭解下。

 

如果你在緩衝DoPaint( CDCHandle dc) 擷取的DC中,在rcPaint之外的繪圖將無法在螢幕上顯示。因為這個記憶體緩衝只把rcPaint中的部分作為一個bitmap映射,其他部分沒有映射。因此會越界的。

 

解決的方法就是不要使用InvalidateRect,直接使用InvalidateWindow。或者修改程式,把那個rcPaint傳過來,自己DoPaint的時候小心。

 

修改的方法,可以參照atltheme.h中的CBufferedPaintImpl,把那個rect也一起傳進來

 

///////////////////////////////////////////////////////////////////////////////// CBufferedPaintImpl - provides buffered paint for any windowtemplate <class T>class ATL_NO_VTABLE CBufferedPaintImpl : public CBufferedPaintBase{public:CBufferedPaint m_BufferedPaint;BP_BUFFERFORMAT m_dwFormat;BP_PAINTPARAMS m_PaintParams;// Overrideablesvoid DoBufferedPaint(CDCHandle dc, RECT& rect){HDC hDCPaint = NULL;if(IsBufferedPaintSupported())m_BufferedPaint.Begin(dc, &rect, m_dwFormat, &m_PaintParams, &hDCPaint);T* pT = static_cast<T*>(this);                if(hDCPaint != NULL)pT->DoPaint(hDCPaint, rect);  //修改成類似這樣elsepT->DoPaint(dc.m_hDC, rect);  //修改成類似這樣if(IsBufferedPaintSupported())m_BufferedPaint.End();}void DoPaint(CDCHandle /*dc*/, RECT& /*rect*/){// must be implemented in a derived classATLASSERT(FALSE);}};

 

 

參考:

http://www.cnblogs.com/wdhust/archive/2011/01/12/1934042.html

http://bbs.csdn.net/topics/390488347

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.