用mfc制作绘图,在ondraw函数中绘制,绘制的图很复杂,基本上占满整个屏幕,且都是用SetPixel绘制,从左到右从上到下绘制。绘制过程中如果点击鼠标,绘图自动终止,然后程序自己重绘,自动调用ondraw函数,重新绘画,可是重新绘画会在上次停止的地方再次停止绘画,又调用ondraw函数,这样一直不断重复。
------解决思路----------------------
写了不少,也不知道你咋实现的。
只觉得有逻辑错误。
------解决思路----------------------
你是不是处理了WM_LBUTTONDOWN/UP等之类的消息。
------解决思路----------------------
"绘制过程中如果点击鼠标(设置标记),(如果有标记)绘图自动终止,(不要)然后程序自己重绘,"
------解决思路----------------------
正常情况应该下,绘图函数正在执行的时候,点击鼠标应该是没有反应的,要等待绘制完毕之后,才会调用鼠标点击的代码;而你点击鼠标会终止绘图,没有代码不好分析。
------解决思路----------------------
先在你的消息,和鼠标事件等中加一些调试信息来分析一下。看你的代码运行逻辑
------解决思路----------------------
系统调用了 OnPaint
而OnPaint调用了OnDraw
使用双缓冲 把数据绘制在内存DC上(内存dc弄成view的成员,而不是局部变量),只有当数据变化的时候 才启动绘制逻辑
OnDraw里 仅仅把内存dc bitblt拷贝到 OnDraw的pDC上
------解决思路----------------------
//业务绘制逻辑
DrawInMemDC( )
If(数据刷新)
{DrawInMemDC( )//数据绘制到内存dc
Invalidate // 刷新界面//把内存dc BitBlt到界面
/*
//这一步 也可以改为bitblt到客户区dc
CClientDC dc(this);
if (m_pMemDC)
{
dc.BitBlt(m_rcView.left,m_rcView.top,m_rcView.Width(),m_rcView.Height(),m_pMemDC,
0,0,SRCCOPY);
}
*/
}
void CViewBase::OnDraw(CDC* pDC)
{
ASSERT(m_pMemDC);
if (m_pMemDC)
{
pDC->BitBlt(m_rcView.left,m_rcView.top,m_rcView.Width(),m_rcView.Height(),m_pMemDC,
0,0,SRCCOPY);
}
}
------解决思路----------------------
1\把数据绘制在内存DC上(内存dc弄成view的成员,而不是局部变量),
2\只有当数据变化的时候 才启动绘制逻辑 (或者计时器 定时把数据往内存dc搬)
3\OnDraw里 仅仅把内存dc bitblt拷贝到 OnDraw的pDC上
总之 中心思想是 把数据的刷新(绘制到内存dc) 跟 界面的刷新(内存DC bitblt到客户区dc,或者paintdc) 逻辑分离