(1)在窗口类里面声明成员变量
class CReportView : public CWnd
{
CBitmap m_btMem; // 背景位图,在内存里面的位图
CBitmap m_btClient; // 前景位图,与客户区域相同大小的位图
int m_nbtMemWidth; // 背景位图宽度
int m_nbtMemHeight; // 背景位图高度
}
(2)在OnSize()里面创建位图
void CReportView::OnSize(UINT nType, int cx, int cy)
{
CWnd::OnSize(nType, cx, cy);
if (cx == 0 && cy == 0)
{
// 如果大小不适合
return;
}
CRect rt;
GetClientRect(rt);
CClientDC dc(this);// 获得dc
if (m_btClient.m_hObject != NULL)
{
m_btClient.DeleteObject();
}
CDC dcClient;
dcClient.CreateCompatibleDC(&dc);
if (m_btClient.m_hObject == NULL)
{
m_nbtMemWidth = rt.Width();
m_nbtMemHeight = rt.Height();
m_btClient.CreateCompatibleBitmap(&dc, m_nbtMemWidth, m_nbtMemHeight);
}
CBitmap* pOldBitmap = dcClient.SelectObject(&m_btClient);
dcClient.FillSolidRect(rt, RGB(255, 255, 255));
dcClient.SelectObject(pOldBitmap);
if (m_btMem.m_hObject != NULL)
{
m_btMem.DeleteObject();
}
CDC dcMem;
dcMem.CreateCompatibleDC(&dc);
if (m_btMem.m_hObject == NULL)
{
m_btMem.CreateCompatibleBitmap(&dc, rt.Width(), rt.Height());
}
DrawBack();// 画背景的函数
}
(3)在OnPaint()贴图
void CReportView::OnPaint()
{
CPaintDC dc(this);
CRect rt;
GetClientRect(rt);
CDC dcClient;
dcClient.CreateCompatibleDC(&dc);
CBitmap* pBitmapClient = dcClient.SelectObject(&m_btClient);
dcClient.FillSolidRect(rtDraw, RGB(255, 255, 255));// 涂成白色
CDC dcMem;
dcMem.CreateCompatibleDC(&dc);
CBitmap* pBitmapMem = dcMem.SelectObject(&m_btMem);
// 把背景图贴到前景图上
dcClient.BitBlt(0, 0, m_nbtMemWidth, m_nbtMemHeight, &dcMem, 0, 0, SRCCOPY);
// 在前景上画一些图
DrawFront(&dcClient);
// 把前景图贴到屏幕上, 倒数第二和第三个参数在某些时候不为0
dc.BitBlt(0, 0, rt.Width(), rt.Height(), &dcClient, 0, 0, SRCCOPY);
dcClient.SelectObject(pBitmapClient);
dcMem.SelectObject(pBitmapMem);
}
(4)在DrawBack()里画背景,该函数在合适的时机调用
void CReportView::DrawBack(void)
{
CClientDC dc(this);
CRect rt(0, 0, m_nbtMemWidth, m_nbtMemHeight);
CDC dcMem;
dcMem.CreateCompatibleDC(&dc);
CBitmap* pOldBitmap = dcMem.SelectObject(&m_btMem);
dcMem.FillSolidRect(rt, RGB(255, 255, 255));// 涂成白色
// dcMem......绘图
dcMem.SelectObject(pOldBitmap);
}
(5)在DrawFront()里画前景
void CReportView::DrawFront(CDC* pDC)
{
// pDC->......绘图
}
(6)在OnDestroy()里删除
void CReportView::OnDestroy()
{
CWnd::OnDestroy();
if (m_btMem.m_hObject != NULL)
{
m_btMem.DeleteObject();
}
if (m_btClient.m_hObject != NULL)
{
m_btClient.DeleteObject();
}
}