hikizzz 2021-04-28 20:25 采纳率: 0%
浏览 54

MFC如何在客户区双缓冲绘图。并在CVIEW类中保存一份memDC

单文档试图架构,想在客户区绘制一个波形,因为数据刷新可能很大,所以采用双缓冲结构,并希望在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);
}

 

  • 写回答

1条回答 默认 最新

  • peng450 2021-04-29 15:54
    关注

    CDC方面不熟悉,双缓冲的方法首先创建一个画板(好像是Cpainter,忘了),然后把你的线条都画在上面,最后把这个画板画到屏幕。

    评论

报告相同问题?

悬赏问题

  • ¥20 ANSYS fluent烟雾扩散仿真
  • ¥15 java 在同一包下无法跨文件引入自己写的类,也无法导包过去
  • ¥15 求帮生成一个lattice diamond的许可证
  • ¥15 大一前端新生求教学解答
  • ¥15 如何制作一个可以查看“网游有序列的装备词条”的软件/插件
  • ¥15 CS2打5E与完美天梯匹配会与服务器断开连接(黑框没标明具体原因)
  • ¥15 求帮助!用赛灵思FPGA XC7A35T对一个频率50MHz的数字信号读取高低电平,只用HR bank普通单端io进行采样可以吗
  • ¥15 训练准确率100%,测试准确率只有50%
  • ¥15 grafana创建dashhabord提示no data sources of type Prometheus Alert
  • ¥15 python用arima时间序列法预测不出结果 急