502
技術社區[雲棲]
解決單文檔滾動條程序中顯示圖像閃爍問題
1、class CPictureProcessView : public CScrollView
如果原來是繼承自CView,則把程序中所有的CView替換成CScrollView。
注意,一定要重載 virtual void OnInitialUpdate(); 否則可能出錯。
2、添加內存DC,內存位圖成員。
CDC m_MemDC; //內存DC
CBitmap m_MemBitmap; //內存位圖
3、在打開文件後,要完成內存DC,和位圖的初始化,同時設置滾動條的範圍。
其實,就是把圖像畫到內存DC中。。
if (bitmap != NULL) { //把 圖像畫到內存DC中 m_MemBitmap.DeleteObject(); CDC *pDC = this->GetDC(); m_MemBitmap.CreateCompatibleBitmap(pDC,bitmap->GetWidth(),bitmap->GetHeight()); m_MemDC.SelectObject(m_MemBitmap); Graphics graphics(m_MemDC.GetSafeHdc()); graphics.DrawImage(bitmap,0,0); this->ReleaseDC(pDC); // 設置滾動條範圍 CSize sizeTotal(bitmap->GetWidth(),bitmap->GetHeight() ); SetScrollSizes(MM_TEXT,sizeTotal); }
4、處理OnDraw函數。
其實就是從內存DC複製到另一個DC中。這裏要注意的是,得到滾動條的位置,可以減少複製的範圍。
我在測試十幾M大小的圖像完全不卡。
if (p_bitmap != NULL) { SCROLLINFO si ; GetScrollInfo ( SB_HORZ ,& si , SIF_ALL ); int hPos = si .nPos ; //水平滾動條 位置 GetScrollInfo ( SB_VERT ,& si , SIF_ALL ); int vPos = si . nPos ; //豎直滾動條位置 CRect tempRect ; this->GetWindowRect(&tempRect); pDC->BitBlt(hPos,vPos,tempRect.Width(),tempRect.Height(),&m_MemDC,hPos,vPos,SRCCOPY); }
5、屏蔽WM_ERASEBKGND消息。
不屏蔽的話會閃爍。
BOOL CPictureProcessView::OnEraseBkgnd(CDC* pDC)
{
//return CScrollView::OnEraseBkgnd(pDC);
return TRUE;
}
最後更新:2017-04-02 06:51:22