采用后台绘图方法绘图,在绘制完成后一定要释放后台内存,否则在将后台那些变量作为全局变量,在多个函数中使用时会报错。
如在PCR项目中,4个PCR传输图像数据,每次只接收1个PCR1行的数据,接收后就将数据在后台做绘制处理,4个PCR数据全部接收完毕后(后台位图拼接画完),将整个后台位图一起显示出来。
这时后台变量必须设为全局变量:启动开始绘制按钮后,将后台和前台DC关联起来(这部分不能放到绘图响应函数中,因为这样最后只能显示最后一行的数据,前面绘制的内容都被覆盖掉),后台BMP的每行绘制在数据接收处理响应函数中进行,所有绘制完成后,前台显示(BitBlt)在OnPaint中完成。
在上述情况下,如果在前台显示完毕后,不释放后台内存,那下次绘制时就会报错(关联冲突等错误)。
下面是个简单的后台绘图,全局变量,释放内存的示例:
将后台、前台变量定义为全局变量:
CBitmap memBmp;
CBitmap *oldBmp;
CDC bDC;
CDC * dpDC;
CRect cRect;
在Button1中完成前台后台关联:
dpDC = GetDlgItem(IDC_PCR2BMP) -> GetDC();
bDC.CreateCompatibleDC(dpDC);
memBmp.CreateCompatibleBitmap(dpDC,240,240);
oldBmp = bDC.SelectObject(&memBmp);
bDC.SetBkColor(RGB(0,0,0));
在Button2中完成绘图并释放后台内存:
CBrush brush1,brush2;
brush1.CreateSolidBrush(RGB(255,0,0));
brush2.CreateSolidBrush(RGB(0,255,0));
cRect.SetRect(0,0,120,120);
bDC.Rectangle(cRect);
bDC.FillRect(&cRect,&brush1);
cRect.SetRect(120,120,240,240);
bDC.Rectangle(cRect);
bDC.FillRect(&cRect,&brush2);
dpDC->BitBlt(0,0,240,240,&bDC,0,0,SRCCOPY);
memBmp.DeleteObject();
bDC.SelectObject(oldBmp);
bDC.DeleteDC();
另外CBrush的使用也要注意,参考http://blog.csdn.net/phenixyf/article/details/45046051