Linux安全网 - Linux操作系统_Linux 命令_Linux教程_Linux黑客

会员投稿 投稿指南 本期推荐:
搜索:
您的位置: Linux安全网 > Linux编程 > » 正文

MFC_双缓冲绘图一例

来源: xingtianxia710 分享至:

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

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

示例:

1、建立一SDI工程Mfc_draw。

2、在类CMfc_drawView中添加变量:

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

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的响应函数, 进行简单绘图控制。

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);
}

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中。

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、编译运行程序。 画线之后, 最小化程序然后还原, 即可看到画出的线依旧存在。


Tags:
分享至:
最新图文资讯
1 2 3 4 5 6
验证码:点击我更换图片 理智评论文明上网,拒绝恶意谩骂 用户名:
关于我们 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 发展历史