MFC双缓冲绘图

用MFC编写绘图程序时, 在窗口最小化再还原后会将绘制的图形擦掉。

解决这一方法可使用双缓冲:在 内存DC中绘制, 然后从内存DCBitBlt到物理DC上。

示例:

1、建立一SDI工程Mfc_draw。

2、在类CMfc_drawView中添加变量:
[cpp] view plain
copy

protected:
CPoint m_ptOld;
CDC m_memDC;
CBitmap m_bmp;
3、在CMfc_drawView中添加WM_CREATE的响应函数, 设置内存DC。


[cpp] view plain
copy

int CMfc_drawView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;

// TODO: Add your specialized creation code here
CDC *pDC = GetDC();
// 创建兼容的内存DC, 注意参数pDC
m_memDC.CreateCompatibleDC(pDC);
int cx = GetSystemMetrics(SM_CXSCREEN);
int cy = GetSystemMetrics(SM_CYSCREEN);
// 创建兼容位图作为内存DC的画布, 注意使用参数pDC
m_bmp.CreateCompatibleBitmap(pDC, cx, cy);
m_memDC.SelectObject(m_bmp);
m_memDC.FillSolidRect(0,0,cx,cy,RGB(255,255,255));
ReleaseDC(pDC);

return 0;
}

4、在CMfc_drawView中添加WM_LBUTTONDOWN和WM_MOUSEMOVE的响应函数, 进行简单绘图控制。

[cpp] view plain
copy

void CMfc_drawView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
m_ptOld = point;

CView::OnLButtonDown(nFlags, point);
}

[cpp] view plain
copy

void CMfc_drawView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if (MK_LBUTTON == nFlags)
{

CPen pen(PS_SOLID, 50, 0xff0000);
CPen *pOldPen = m_memDC.SelectObject(&pen);
m_memDC.MoveTo(m_ptOld);
m_memDC.LineTo(point);
m_ptOld = point;
m_memDC.SelectObject(pOldPen);
Invalidate(FALSE);
UpdateWindow();
}

CView::OnMouseMove(nFlags, point);
}
5、在OnDraw函数中从内存DC显示到物理DC中。

[cpp] view plain
copy

void CMfc_drawView::OnDraw(CDC* pDC)
{
CMfc_drawDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CRect rc;
GetClientRect(&rc);
pDC->BitBlt(0, 0, rc.right, rc.bottom, &m_memDC, 0, 0, SRCCOPY);
}

6、编译运行程序。 画线之后, 最小化程序然后还原, 即可看到画出的线依旧存在。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值