单文档试图架构,想在客户区绘制一个波形,因为数据刷新可能很大,所以采用双缓冲结构,并希望在CVIEW中能保存内存CDC的变量Memdc,方便更新。
但在实际操作过程中如果,我在OnDRAW函数中,对MemCDC画图并复制到PDC中就会有内存报错。
之后我尝试在CVIEW类的OnCreat函数中对MemCDC画图。
int CMFCApplication1View::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: 在此添加您专用的创建代码
CClientDC dc(this);
CRect rect;
GetClientRect(&rect);
dcMem.CreateCompatibleDC(&dc);
bmp.CreateCompatibleBitmap(&dc, rect.Width(), rect.Height());
pOldBmp = dcMem.SelectObject(&bmp);
CPen solidPen(PS_SOLID, 0, RGB(255, 0, 0));
CPen* oldPen = dcMem.SelectObject(&solidPen);
dcMem.MoveTo(rect.Width() / 3, rect.Height() / 3);
dcMem.LineTo(rect.Width() / 3 * 2, rect.Height() / 3);
dcMem.LineTo(rect.Width() / 3 * 2, rect.Height() / 3 * 2);
dcMem.LineTo(rect.Width() / 3, rect.Height() / 3 * 2);
dcMem.LineTo(rect.Width() / 3, rect.Height() / 3);
dcMem.SelectObject(oldPen);
//dcMem.SelectObject(pOldBmp);
UpdateWindow();
return 0;
}
在OnDraw中进行拷贝,虽然成功判断了Memdc不为空,但此时却没有内容赋给OnDraw中的PDC
void CMFCApplication1View::OnDraw(CDC* pDC/*pDC*/)
{
CMFCApplication1Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: 在此处为本机数据添加绘制代码
CRect rect;
GetClientRect(&rect);
//pDC->TextOutA(rect.Width() / 2, rect.Height() / 2, "dasdasd");
if (dcMem.GetSafeHdc() == NULL)
{
pDC->TextOutA(rect.Width()/2, rect.Height()/2,"dasdasd");
}
else {
pDC->TextOutA(rect.Width() / 2, rect.Height() / 2, "xzczxczxcs");
(*pDC).BitBlt(0, 0, rect.Width(), rect.Height(),
&dcMem, 0, 0, SRCCOPY);
}
//DeleteObject(&bmp);
//dcMem.DeleteDC();
//DeleteObject(pOldBmp);
}