绘制DIB:直接在DIB进行GDI操作
Create(m_hbitmap);
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);
}
}
}