CStatic类的GDI双缓冲绘图

放于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();		//删除画笔
} 

猜你喜欢

转载自blog.csdn.net/Mrweng1996/article/details/81584031