MFC 双缓存放大 -----求助

qq_36003984 2016-11-12 12:29:37
内存中创建了位图 在位图上画波形 双缓存映射到picture control控件上 现在我想通过 OnLButtonDown OnMouseMove OnLButttonUp 选择波形 进行放大 我现在刚可以在波形上画一个 CRect 但是这个CRect 一直闪 只有鼠标动的时候 rect才显示 哪位大神 仔细指导一下 小弟谢过了
...全文
260 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaohuh421 2016-11-14
  • 打赏
  • 举报
回复
首先告诉你, 双缓冲并不能完全解解闪烁的问题. 双缓冲只能解析 因为绘制过慢导致的闪烁问题. 原因在于MFC的坑爹机制, 他会先绘制背景, 再绘制背景. 那么invalidate就必然会有闪烁, 你如果用得多, 就会发现, 它自己的的控件, 比如MFC中的 CStatic 或者CEdit, 如果你快速的设置text,就会发现闪得厉害. 一般解决办法我常用的就是两种 1. 每次需要绘制时, 就直接使用GetDC, 然后绘制, 这需要全部绘制) 不调用invalidate. (当然, 注意在onPaint的时候也需要绘制) (推荐) 2. 背景设置为透明, 不绘制它, 也就不会出现闪烁了. (不推荐,可能导致某些绘制显示异常)
schlafenhamster 2016-11-14
  • 打赏
  • 举报
回复
这段代码 就是 创建一个 选择 放大的 rect 区域 1 OnLButtonDown 记录 新的 开始点 m_startPoint = point;(m_ 模块变量 在 h 中 定义) 其中的 DrawRectBorder(dc,rc); 是擦除 上次的 框 2 OnMouseMove(UINT nFlags, CPoint point) 就是 擦除 上次 画 这次 的 框 3 OnLButtonUp(UINT nFlags, CPoint point) 就是 用户已经 确定 框的大小,你的放大程序 在 这里调用。
worldy 2016-11-13
  • 打赏
  • 举报
回复
绘图在WM_PAINT内执行 鼠标动作或者用户操作改变数据或者对象或者结果集合A 在WM_PAINT内,使用A的内容进行绘图 如果使用双缓冲可以在WM_ERASEBKGND事件直接返回true 窗口的风格加入WS_CLIPCHILDREN
qq_36003984 2016-11-13
  • 打赏
  • 举报
回复
引用 4 楼 schlafenhamster 的回复:

void CRectTrackDlg::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	if(m_startPoint != m_OldPoint)
	{// erase old rect
		CClientDC dc(this);
		CRect rc(m_startPoint,m_OldPoint);
		rc.NormalizeRect();
		DrawRectBorder(dc,rc);
		InvertRectColor(dc,rc);
	}
//	afxDump << point << "\n";
	m_startPoint = point;
	m_OldPoint = point;
//	
	CDialog::OnLButtonDown(nFlags, point);
}\void CRectTrackDlg::OnLButtonUp(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	ReleaseCapture();
//
	CRect rcDlg;
	GetClientRect(rcDlg);
	if(point.x < 0) point.x=0;
	if(point.y < 0) point.y=0;
	if(point.x > rcDlg.Width() ) point.x=rcDlg.Width();
	if(point.y > rcDlg.Height()) point.y=rcDlg.Height();
	m_OldPoint=point;
// draw rect
	CClientDC dc(this);
	CRect rc(m_startPoint,m_OldPoint);
	rc.NormalizeRect();
	InvertRectColor(dc,rc);
//	
	CDialog::OnLButtonUp(nFlags, point);
}

void CRectTrackDlg::OnMouseMove(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	if (MK_LBUTTON==nFlags)
	{
		SetCapture();
		CClientDC dc(this);
		if(m_startPoint != m_OldPoint)
		{
			CClientDC dc(this);
			CRect rcOld(m_startPoint,m_OldPoint);
			rcOld.NormalizeRect();
			DrawRectBorder(dc,rcOld);
		}
		CRect rcNew(m_startPoint,point);
		rcNew.NormalizeRect();
		DrawRectBorder(dc,rcNew);
		m_OldPoint = point;
	}
//	
	CDialog::OnMouseMove(nFlags, point);
}

使用 CRectTrack
大神 能不能帮忙看一下
qq_36003984 2016-11-12
  • 打赏
  • 举报
回复
自己 再顶一下
qq_36003984 2016-11-12
  • 打赏
  • 举报
回复
自己顶 一下
schlafenhamster 2016-11-12
  • 打赏
  • 举报
回复
CPoint m_startPoint;
CPoint m_OldPoint;
schlafenhamster 2016-11-12
  • 打赏
  • 举报
回复
void CRectTrackDlg::DrawRectBorder(CDC &dc,CRect rc)
{
int s= dc.SaveDC();
dc.SetROP2(R2_NOTXORPEN);
CPen pen(PS_DASH,1,RGB(255,0,0));
dc.SelectObject(&pen);
#if 1
dc.MoveTo(rc.left,rc.bottom);
dc.LineTo(rc.left,rc.top);
dc.LineTo(rc.right,rc.top);
dc.LineTo(rc.right,rc.bottom);
dc.LineTo(rc.left,rc.bottom);
#else
dc.SelectStockObject(NULL_BRUSH);
dc.Rectangle(rc.left,rc.top,rc.right,rc.bottom);
#endif
dc.RestoreDC(s);

}
schlafenhamster 2016-11-12
  • 打赏
  • 举报
回复

void CRectTrackDlg::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	if(m_startPoint != m_OldPoint)
	{// erase old rect
		CClientDC dc(this);
		CRect rc(m_startPoint,m_OldPoint);
		rc.NormalizeRect();
		DrawRectBorder(dc,rc);
		InvertRectColor(dc,rc);
	}
//	afxDump << point << "\n";
	m_startPoint = point;
	m_OldPoint = point;
//	
	CDialog::OnLButtonDown(nFlags, point);
}\void CRectTrackDlg::OnLButtonUp(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	ReleaseCapture();
//
	CRect rcDlg;
	GetClientRect(rcDlg);
	if(point.x < 0) point.x=0;
	if(point.y < 0) point.y=0;
	if(point.x > rcDlg.Width() ) point.x=rcDlg.Width();
	if(point.y > rcDlg.Height()) point.y=rcDlg.Height();
	m_OldPoint=point;
// draw rect
	CClientDC dc(this);
	CRect rc(m_startPoint,m_OldPoint);
	rc.NormalizeRect();
	InvertRectColor(dc,rc);
//	
	CDialog::OnLButtonUp(nFlags, point);
}

void CRectTrackDlg::OnMouseMove(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	if (MK_LBUTTON==nFlags)
	{
		SetCapture();
		CClientDC dc(this);
		if(m_startPoint != m_OldPoint)
		{
			CClientDC dc(this);
			CRect rcOld(m_startPoint,m_OldPoint);
			rcOld.NormalizeRect();
			DrawRectBorder(dc,rcOld);
		}
		CRect rcNew(m_startPoint,point);
		rcNew.NormalizeRect();
		DrawRectBorder(dc,rcNew);
		m_OldPoint = point;
	}
//	
	CDialog::OnMouseMove(nFlags, point);
}

使用 CRectTrack

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧