问题比较长,请大家进来看一看,提供点思路,不胜感激:)

时间:2023-01-04 14:14:47
说来有点长,简单的说:
想在CFormView中画出由采集卡采集到数据的波形图,画出波形图后,想实现下面的功能:

鼠标在波形图区移动时,在移动的横坐标处画出一条垂直扫描线,并且它随着鼠标的移动而移动并将与波形图相交处的数据值动态的显示在一个指定的地方。

我现在无法想通的地方就是 CFormView的OnDraw()与OnMouseMove()这两个函数之间怎样通讯,我写了画扫描线的函数DrawScanLine(pDC,int x)但发现将它放在OnMouseMove()中调用时,这条扫描线无法随鼠标移动,下面有一部分代码:

逻辑原点在OnDraw()中从新设置过
void CPortfireView::OnMouseMove(UINT nFlags, CPoint point) 
{
// TODO: Add your message handler code here and/or call default
CClientDC dc(this);
dc.DPtoLP(&point);
if((point.x>1)&&(point.x<539))
DrawScanLine(&dc,point.x);
CFormView::OnMouseMove(nFlags, point);
}

画扫描线的函数如下:
void CPortfireView::DrawScanLine(CDC *pDC, int x)
{
 CPen *pOldPen;
 CPen MaskPen(PS_SOLID,1,RGB(0,0,0));
 CPen ScanLinePen(PS_SOLID,1,RGB(0,0,255));

 pDC->MoveTo(m_nScanLinePos,-2);
 pOldPen=pDC->SelectObject(&MaskPen);
 pDC->LineTo(m_nScanLinePos,-310);

 pDC->MoveTo(x,-2);
 pDC->SelectObject(&ScanLinePen);
 pDC->LineTo(x,-310);

 pDC->SelectObject(pOldPen);
 pDC->MoveTo(0,0);
 m_nScanLinePos=x;
}//用相同的颜色抹掉先前的一条,然后再 在鼠标横坐标处画一条

我刚学VC,第一次写比较大的与画图有关的程序,是不是代码有原理性错误,望高手帮忙纠正一下错误,或提供一点思路,最好有些代码:)小弟先谢过了!

9 个解决方案

#1


绘图代码放到onpaint或ondraw里,放到这里,没有用。因为不执行刷新的话怎么也显示不了。

#2


我给你修改了一下,没有调试,但应该能通过,但你这样刷新的频率会很高,具体是否可行,你自己考虑!

void CPortfireView::OnMouseMove(UINT nFlags, CPoint point) 
{
// TODO: Add your message handler code here and/or call default
if((point.x>1)&&(point.x<539))
InvalidateRect(rect,FALSE);
CFormView::OnMouseMove(nFlags, point);
}

void CPortfileView::OnPaint()
{
CPaintDC dc(this);//CPaintDC不需要调用begin和end dc这两个函数,WINDOWS完成
。。。//设置一个参数用来标志绘制 该线
DrawScanLine(&dc, int x);
}

#3


OnPaint与OnDraw有什么本质不同?

#4


两个的不同主要在于打印机和显示器上(可以这么说吧?)

在默认的模式下,可以两个之间是相互调用的。
在设置了不同的模式下,可以用来实现打印和显示不相同的效果。
如果你有兴趣可以关注 WINDOWS技术内幕 ,

#5


学习

#6


OnPaint()响应Windows的WM_PAINT消息,MFC中默认调用OnDraw(),OnDraw()也可以被OnPrint()调用,这样,屏幕显示(WM_PAINT)和打印(OnPrint())如果都调用同样的代码(OnDraw()),就可以实现显示和打印一致,也就是“所见即所得”。

#7


你在OnDraw()或OnPaint()中画什么啊,你不就是要画一条垂直线嘛,
这条线可以不画,而且栅格处理这种方法画它。
只要在OnMouseMove中将鼠标下线所在区域屏幕内容栅格求反,移走时再将这个区域求一次反
其实这跟CSplitWnd的原理一样,你可以去参考一下MFC类库中的CSplitWnd::OnMouseMove

#8


OnDraw()与OnMouseMove()之间怎样传递参数?比如说,鼠标的横坐标,难道要在CFormView中定义一变量:m_nCurrentPos?

另外,SetViewportOrg()是不是每次OnDraw()时都要调用?还是只调用一次后,原点就一直保持不变?

#9


能不能在鼠标移动时只 Draw客户区的一部分,我用了InvalidateRect(&rect)//rect是客户区的一部分

但屏幕没有刷新,怎么回事?是不是没有调用OnDraw()?

#1


绘图代码放到onpaint或ondraw里,放到这里,没有用。因为不执行刷新的话怎么也显示不了。

#2


我给你修改了一下,没有调试,但应该能通过,但你这样刷新的频率会很高,具体是否可行,你自己考虑!

void CPortfireView::OnMouseMove(UINT nFlags, CPoint point) 
{
// TODO: Add your message handler code here and/or call default
if((point.x>1)&&(point.x<539))
InvalidateRect(rect,FALSE);
CFormView::OnMouseMove(nFlags, point);
}

void CPortfileView::OnPaint()
{
CPaintDC dc(this);//CPaintDC不需要调用begin和end dc这两个函数,WINDOWS完成
。。。//设置一个参数用来标志绘制 该线
DrawScanLine(&dc, int x);
}

#3


OnPaint与OnDraw有什么本质不同?

#4


两个的不同主要在于打印机和显示器上(可以这么说吧?)

在默认的模式下,可以两个之间是相互调用的。
在设置了不同的模式下,可以用来实现打印和显示不相同的效果。
如果你有兴趣可以关注 WINDOWS技术内幕 ,

#5


学习

#6


OnPaint()响应Windows的WM_PAINT消息,MFC中默认调用OnDraw(),OnDraw()也可以被OnPrint()调用,这样,屏幕显示(WM_PAINT)和打印(OnPrint())如果都调用同样的代码(OnDraw()),就可以实现显示和打印一致,也就是“所见即所得”。

#7


你在OnDraw()或OnPaint()中画什么啊,你不就是要画一条垂直线嘛,
这条线可以不画,而且栅格处理这种方法画它。
只要在OnMouseMove中将鼠标下线所在区域屏幕内容栅格求反,移走时再将这个区域求一次反
其实这跟CSplitWnd的原理一样,你可以去参考一下MFC类库中的CSplitWnd::OnMouseMove

#8


OnDraw()与OnMouseMove()之间怎样传递参数?比如说,鼠标的横坐标,难道要在CFormView中定义一变量:m_nCurrentPos?

另外,SetViewportOrg()是不是每次OnDraw()时都要调用?还是只调用一次后,原点就一直保持不变?

#9


能不能在鼠标移动时只 Draw客户区的一部分,我用了InvalidateRect(&rect)//rect是客户区的一部分

但屏幕没有刷新,怎么回事?是不是没有调用OnDraw()?