閱讀502 返回首頁    go 技術社區[雲棲]


解決單文檔滾動條程序中顯示圖像閃爍問題

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

  上一篇:go MSP430單片機定時器學習筆記
  下一篇:go 深入理解fork()