放于OnPaint函数的代码:
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
CPaintDC* pDC = &dc;
CRect client;
GetClientRect(&client);
CDC MemDc; //首先定义一个显示设备对象
CBitmap MemMap; //定义一个位图对象
MemDc.CreateCompatibleDC(pDC); //创建一个与指定设备兼容的内存设备上下文环境
MemMap.CreateCompatibleBitmap(pDC, client.Width(), client.Height());
MemDc.SelectObject(&MemMap); //将位图选入到内存显示设备中
MemMap.DeleteObject(); //释放设备
MemDc.SetBkMode(TRANSPARENT); //设置背景为透明
//自己的要画的图像存到虚拟的dc中
//Draw(&MemDc,client);
pDC->SetBkMode(TRANSPARENT); //设置背景为透明
pDC->BitBlt(client.left, client.top, client.Width(), client.Height(), &MemDc, 0, 0, SRCCOPY); //复制到pDC中
MemDc.DeleteDC(); //释放设备
以上的步骤大致可理解为:
步骤:1、取出dc地址存于一个指针中,并获取窗口大小备用;
2、定义一个显示设备对象和一个位图对象,显示设备相当于一个画框,这是虚拟的,位图相当于是画布。将这个画布 定义和窗口一样大小,并将画布贴到画框上形成一个整体,并释放设备;
3、然后将要显示的图像存放到这个虚拟的dc中,存完之后再将这个虚拟dc中的图像复制到显示的dc中显示。
关于上面代码里的draw函数(也就是各自的画图函数),我在这举个例子:
void CDispaly::Draw(CDC* pMemDc , CRect client) //画道路函数
{
CPen newPen; // 用于创建新画笔
pMemDc->FillSolidRect(0,0, client.Width(),client.Height(),RGB(255,255,255));//先用背景色将位图清除干净,颜色自选
newPen.CreatePen(PS_SOLID , 5, RGB(255,255,0)); //PS_SOLID代表线形实线,线宽为5
pMemDc->SelectObject(&newPen); //把一个对象(位图、画笔、画刷等)选入指定的设备描述表
pMemDc->MoveTo(0,7); //移动到起始点
pMemDc->LineTo(1200,7); //画线到终点
pMemDc->FillSolidRect(0, 10, 1200, 80, RGB(128,128,128)); //填充某一个区域
pMemDc->MoveTo(0,92); //移动到起始点
pMemDc->LineTo(1200,92); //画线到终点
pMemDc->FillSolidRect(0,95, 1200,80,RGB(128,128,128)); //填充某一个区域
pMemDc->MoveTo(0,177); //移动到起始点
pMemDc->LineTo(1200,177); //画线到终点
pMemDc->FillSolidRect(0,180, 1200,80,RGB(128,128,128)); //填充某一个区域
pMemDc->MoveTo(0,262); //移动到起始点
pMemDc->LineTo(1200,262); //画线到终点
newPen.DeleteObject(); //删除画笔
}