精通Visual C++圖象程式設計---讀書筆記6.1

藍色水發表於2020-04-05
 繪製DIB:直接在DIB進行GDI操作
   Win32 SDK和MFC都提供大量的GDI操作函式,如能直接在DIB處理中使用這些函式,將大大提高DIB的處理能力,作為CDib類的一大特色,CDib類設計了一種巧妙的方式來實現直接繪製DIB,即在DIB中進行GDI操作.
   對GDI操作進行分析可發現,幾乎所有的GDI操作都是對裝置上下文來進行的(HDC/CDC、CPaintDC、CWindowDC、CClientDC).我們的基本思想是,建立一個記憶體裝置上下文(m_pMemDC),並將DIB對應的DDB(m_pBitmap)選進m_pMemDC;在外部程式中,針對該記憶體裝置上下文所做的任何操作都將反映在m_pBitmap中;操作完成後,根據m_pBitmap相關的DIBSECTION控制程式碼m_hBitmap更新DIB,使實現了DIB的繪製.CDib的這一功能由函式BeginPaint和EndPaint實現.
    BeginPaint建立記憶體裝置上下文m_pMemDC,將m_pBitmap選進m_pMemDC,並向外界返回m_pMemDC,供外界進行GDI操作 .
    CDC* CDib::BeginPaint(CDC *pDC)
  {
       m_pMemDC=new CDC;
       m_pMemDC->CreateCompatibleDC(pDC);
       m_pPaletteTmp=m_pMemDC->SelectPalette(m_pPalette,TRUE);
       m_pMemDC->RealizePalette();
       m_pBitmapTmp=(CBitmap*)m_pMemDC->SelectObject(m_pBitmap);
      return m_pMemDC;
}
   EndPaint 函式用於結束GDI操作,包括刪除m_pMemDC,根據m_hBitmap更新DIB:
void CDib::EndPaint()
{
      m_pMemDC->SelectObject(m_pBitmapTmp);
      m_pMemDC->SelectPalette(m_pPaietteTmp,TRUE);
      delete m_pMemDC;
    
       Create(m_hbitmap);
}
 
 
 
}
 
 
 
 
 
 
  }
 

相關文章