OnPaint()的问题?为什么我的程序要刷很多次才能得到正确的结果? 1.在定时器中刷新2.设置标志,在OnPaint前设标志FALSE,最后设标志为TRUE,数据改变后只有当标志为TRUE才Invalidate 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 Edit中的内容更新应该用UpdateWindow(); Sorry:我是想说" 而且设断的话没有上面的问题 ",我说这句话的意思是我的程序中计算坐标是没有问题的!TO:: AloneWolf(孤狼) 1、用定时器刷新的话,没有必要,因为用户只是在改变参数时才会有这种情况,还有有些时候我是不想让它刷新,让用户点了一个操作才Invalidate的 2.我刚也试过了,也是有时刷新不过来,但比率比较小一点! To:用UpdateWindow 和上面的情况也一样!还是要刷二次!我把我那部分的代码写一下吧:void CWbwzView::OnParameterset() //一个Button的相应函数{ UpdateData( false );//Line 1 m_bParameterChanged = false; CDLGQuery dlgQuery; dlgQuery.DoModal(); OnChangleData( here ); UpdateData( true ); }这样做的话,要时点两次Button才能刷新我的数据,有没有Line 1都一样!而且我发现我的问题每次都出现在模式对话框被灭了之后,是不是系统产生的刷新和我的有冲突!急,高手Help! 用Invalidate()也会 都现在上面参为多的情况,也是有对话框出来的时候出现会有,在没有时刷新的话也会有,但只要两次就搞定!这是为什么??? memory dc 是什么东东, 我想怎么实现! 对呀,应该用mem dc的。最后BitBlt一下,绝对的没有闪烁。 我认为可能是你的曲线计算没算好,会不会呢如果要用mem dc,双缓冲绘图,这个很好,不会产生闪烁感。 那应该就是在你的OnPaint里没有处理好。你用双缓冲试一下,把所有要绘的图都绘在memory中,然后直接绘出来 用双缓冲我是要试一下!OnPaint()就是调几个画图的函数应该没有问题的;而且我的每个程序都出现这种情况!OnPaint就是画图了,关键是它提前画了!它怎么知道我下面要画图呢! UpdateData跟刷新没任何关系,还是应该Invalidate或InvalidateRect.你最好把OnDraw或OnPaint(若是向导生成的话一般不会直接重载该方法)的代码给出.至于闪烁可以通过Memory DC解决 你在OnPaint()里是怎么画的? 你的上面那段代码有些问题,是UpdateData()的问题。你按下面这样写试试:void CWbwzView::OnParameterset() //一个Button的相应函数{ UpdateData( true );//Line 1 m_bParameterChanged = false; CDLGQuery dlgQuery; dlgQuery.DoModal(); OnChangleData( here ); UpdateData( false );}UpdateData()的参数为true时是得到对话框的数据,而false才是向对话框传数据。 你是否另开了一个线程作计算,如果是的话,就要注意数据的同步了;另外你应该有一个专门的去绘制图表的函数(且能覆盖掉前次绘制结果),在OnPaint中也是调用这个函数,同时更新数据从画时也调用这个函数从绘,而不要用UpdateWindow和Invalidate,因为这样不管你用不用双缓冲都会闪的。 对:UpdateData()是用错了,但改过来还是不行,就是要刷两次!两次就会有一次能刷过来! void CWbxcqView::OnDraw(CDC* pDC){ //Do Some initialize here,Such as Select Font,Pen ECt... GetDataFromDB( strFilter ); DrawYValue(pDC,m_MaxUnit.fU,m_MaxUnit.fI,m_MaxUnit.fW,m_MaxUnit.fP,m_MaxUnit.fT,m_bPrintFlag);//Draw others;};就是DrawYValue时出错,还用了以前的变量的位置,DrawYValue 如下void CWbxcqView::DrawYValue(CDC *pDC, double m_maxU, double m_maxI, double m_maxW, double m_maxP, double m_maxRMP, BOOL m_bPrintFlag){CString strTemp;//UpDC->SetTextColor( clrDraw[BLUE] );//Select pen color;for (int i=0;i<=10 && bDrawCurve[0];i++)//bDrawCurve: If this curve be drawed{ strTemp.Format("4.2f",i*m_MaxUnit.fU/10.0);//convert pDC->TextOut(m_nXUint+m_nXPos[0],m_nDataB- i*m_yScale , strTemp );}//... Draw other six , as the same codes;}m_nXPos 的值会在 GetDataFromDB中得到;然后再DrawYValue的,为什么就会出错呢? 在内存中画!!!or开线程画!!!用MFC如何高效地绘图TouchMe 显示图形如何避免闪烁,如何提高显示效率是问得比较多的问题。而且多数人认为MFC的绘图函数效率很低,总是想寻求其它的解决方案。MFC的绘图效率的确不高但也不差,而且它的绘图函数使用非常简单,只要使用方法得当,再加上一些技巧,用MFC可以得到效率很高的绘图程序。我想就我长期(呵呵当然也只有2年多)使用MFC绘图的经验谈谈我的一些观点。1、显示的图形为什么会闪烁? 我们的绘图过程大多放在OnDraw或者OnPaint函数中,OnDraw在进行屏幕显示时是由OnPaint进行调用的。当窗口由于任何原因需要重绘时,总是先用背景色将显示区清除,然后才调用OnPaint,而背景色往往与绘图内容反差很大,这样在短时间内背景色与显示图形的交替出现,使得显示窗口看起来在闪。如果将背景刷设置成NULL,这样无论怎样重绘图形都不会闪了。当然,这样做会使得窗口的显示乱成一团,因为重绘时没有背景色对原来绘制的图形进行清除,而又叠加上了新的图形。 有的人会说,闪烁是因为绘图的速度太慢或者显示的图形太复杂造成的,其实这样说并不对,绘图的显示速度对闪烁的影响不是根本性的。例如在OnDraw(CDC *pDC)中这样写: pDC->MoveTo(0,0); pDC->LineTo(100,100);这个绘图过程应该是非常简单、非常快了吧,但是拉动窗口变化时还是会看见闪烁。其实从道理上讲,画图的过程越复杂越慢闪烁应该越少,因为绘图用的时间与用背景清除屏幕所花的时间的比例越大人对闪烁的感觉会越不明显。比如:清楚屏幕时间为1s绘图时间也是为1s,这样在10s内的连续重画中就要闪烁5次;如果清楚屏幕时间为1s不变,而绘图时间为9s,这样10s内的连续重画只会闪烁一次。这个也可以试验,在OnDraw(CDC *pDC)中这样写: for(int i=0;i<100000;i++) { pDC->MoveTo(0,i); pDC->LineTo(1000,i); }呵呵,程序有点变态,但是能说明问题。 说到这里可能又有人要说了,为什么一个简单图形看起来没有复杂图形那么闪呢?这是因为复杂图形占的面积大,重画时造成的反差比较大,所以感觉上要闪得厉害一些,但是闪烁频率要低。 那为什么动画的重画频率高,而看起来却不闪?这里,我就要再次强调了,闪烁是什么?闪烁就是反差,反差越大,闪烁越厉害。因为动画的连续两个帧之间的差异很小所以看起来不闪。如果不信,可以在动画的每一帧中间加一张纯白的帧,不闪才怪呢。2、如何避免闪烁 在知道图形显示闪烁的原因之后,对症下药就好办了。首先当然是去掉MFC提供的背景绘制过程了。实现的方法很多, * 可以在窗口形成时给窗口的注册类的背景刷付NULL * 也可以在形成以后修改背景 static CBrush brush(RGB(255,0,0)); SetClassLong(this->m_hWnd,GCL_HBRBACKGROUND,(LONG)(HBRUSH)brush); * 要简单也可以重载OnEraseBkgnd(CDC* pDC)直接返回TRUE 这样背景没有了,结果图形显示的确不闪了,但是显示也象前面所说的一样,变得一团乱。怎么办?这就要用到双缓存的方法了。双缓冲就是除了在屏幕上有图形进行显示以外,在内存中也有图形在绘制。我们可以把要显示的图形先在内存中绘制好,然后再一次性的将内存中的图形按照一个点一个点地覆盖到屏幕上去(这个过程非常快,因为是非常规整的内存拷贝)。这样在内存中绘图时,随便用什么反差大的背景色进行清除都不会闪,因为看不见。当贴到屏幕上时,因为内存中最终的图形与屏幕显示图形差别很小(如果没有运动,当然就没有差别),这样看起来就不会闪。3、如何实现双缓冲 首先给出实现的程序,然后再解释,同样是在OnDraw(CDC *pDC)中: CDC MemDC; //首先定义一个显示设备对象 CBitmap MemBitmap;//定义一个位图对象 //随后建立与屏幕显示兼容的内存显示设备 MemDC.CreateCompatibleDC(NULL); //这时还不能绘图,因为没有地方画 ^_^ //下面建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小 MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight); //将位图选入到内存显示设备中 //只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上 CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap); //先用背景色将位图清除干净,这里我用的是白色作为背景 //你也可以用自己应该用的颜色 MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255)); //绘图 MemDC.MoveTo(……); MemDC.LineTo(……); //将内存中的图拷贝到屏幕上进行显示 pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY); //绘图完成后的清理 MemBitmap.DeleteObject(); MemDC.DeleteDC();上面的注释应该很详尽了,废话就不多说了。4、如何提高绘图的效率 我主要做的是电力系统的网络图形的CAD软件,在一个窗口中往往要显示成千上万个电力元件,而每个元件又是由点、线、圆等基本图形构成。如果真要在一次重绘过程重画这么多元件,可想而知这个过程是非常漫长的。如果加上了图形的浏览功能,鼠标拖动图形滚动时需要进行大量的重绘,速度会慢得让用户将无法忍受。怎么办?只有再研究研究MFC的绘图过程了。 实际上,在OnDraw(CDC *pDC)中绘制的图并不是所有都显示了的,例如:你在OnDraw中画了两个矩形,在一次重绘中虽然两个矩形的绘制函数都有执行,但是很有可能只有一个显示了,这是因为MFC本身为了提高重绘的效率设置了裁剪区。裁剪区的作用就是:只有在这个区内的绘图过程才会真正有效,在区外的是无效的,即使在区外执行了绘图函数也是不会显示的。因为多数情况下窗口重绘的产生大多是因为窗口部分被遮挡或者窗口有滚动发生,改变的区域并不是整个图形而只有一小部分,这一部分需要改变的就是pDC中的裁剪区了。因为显示(往内存或者显存都叫显示)比绘图过程的计算要费时得多,有了裁剪区后显示的就只是应该显示的部分,大大提高了显示效率。但是这个裁剪区是MFC设置的,它已经为我们提高了显示效率,在进行复杂图形的绘制时如何进一步提高效率呢?那就只有去掉在裁剪区外的绘图过程了。可以先用pDC->GetClipBox()得到裁剪区,然后在绘图时判断你的图形是否在这个区内,如果在就画,不在就不画。如果你的绘图过程不复杂,这样做可能对你的绘图效率不会有提高。 1.memory dc,平时即画到memory dc又画到屏幕上,OnPaint时把memory dc BitBlt到屏幕上2.闪烁是因为重画背景,a.Invalidate(false);b.楼上3.Invalidate();不会马上执行OnPaint,只是在消息队列里放WM_PAINT消息,系统一般在有空闲时才执行该消息 各位朋友给的信息对我以后编程有很大的帮助,但是现在我还是不明白,我是先取得数据再画图,为什么图形就是用我以前的数据!按 wing_pn 的说法,画图应该再在后面才对的,那不就更应该画出对的数据吗? 真的没有人知道为什么吗?还是我的问题讲得不清楚?再看一看些代码好了:void CWbxcqView::OnDraw(CDC* pDC){ //Do Some initialize here,Such as Select Font,Pen ECt... GetDataFromDB( strFilter ); DrawYValue(pDC,m_MaxUnit.fU,m_MaxUnit.fI,m_MaxUnit.fW,m_MaxUnit.fP,m_MaxUnit.fT,m_bPrintFlag);//Draw others;};就是DrawYValue时出错,还用了以前的变量的位置,DrawYValue 如下void CWbxcqView::DrawYValue(CDC *pDC, double m_maxU, double m_maxI, double m_maxW, double m_maxP, double m_maxRMP, BOOL m_bPrintFlag){CString strTemp;//UpDC->SetTextColor( clrDraw[BLUE] );//Select pen color;for (int i=0;i<=10 && bDrawCurve[0];i++)//bDrawCurve: If this curve be drawed{ strTemp.Format("4.2f",i*m_MaxUnit.fU/10.0);//convert pDC->TextOut(m_nXUint+m_nXPos[0],m_nDataB- i*m_yScale , strTemp );}//... Draw other six , as the same codes;}m_nXPos 的值会在 GetDataFromDB中得到;然后再DrawYValue的,为什么就会出错呢 VC图片处理方面的一个的问题 我想给一个窗口画上有颜色的边框,这样做不生效呀.请大家帮帮忙. 关于广播的一些问题,谢谢! 百分求解bmptojpg 程序 脚本取得控件属性的问题 我这样往文件里写内容,难道不对吗? 离职散分(有空也帮我解决问题) 怎么在一个程序中使用另一个程序中的控件对象? 利用blade_enc.dll将.wav转化为.mp3后,音乐的质量差的问题!!! VC6.0 上位机与下位机串口通信问题 ---关于list box的初始化问题 Help!Help!内存泄漏
TO:: AloneWolf(孤狼)
1、用定时器刷新的话,没有必要,因为用户只是在改变参数时才会有这种情况,还有有些时候我是不想让它刷新,让用户点了一个操作才Invalidate的
2.我刚也试过了,也是有时刷新不过来,但比率比较小一点!
void CWbwzView::OnParameterset() //一个Button的相应函数
{
UpdateData( false );//Line 1
m_bParameterChanged = false;
CDLGQuery dlgQuery;
dlgQuery.DoModal();
OnChangleData( here );
UpdateData( true );
}
这样做的话,要时点两次Button才能刷新我的数据,有没有Line 1都一样!而且我发现我的问题每次都出现在模式对话框被灭了之后,是不是系统产生的刷新和我的有冲突!急,高手Help!
最后BitBlt一下,绝对的没有闪烁。
如果要用mem dc,双缓冲绘图,这个很好,不会产生闪烁感。
你用双缓冲试一下,把所有要绘的图都绘在memory中,然后直接绘出来
OnPaint()就是调几个画图的函数应该没有问题的;
而且我的每个程序都出现这种情况!
OnPaint就是画图了,关键是它提前画了!
它怎么知道我下面要画图呢!
你最好把OnDraw或OnPaint(若是向导生成的话一般不会直接重载该方法)的代码给出.
至于闪烁可以通过Memory DC解决
void CWbwzView::OnParameterset() //一个Button的相应函数
{
UpdateData( true );//Line 1
m_bParameterChanged = false;
CDLGQuery dlgQuery;
dlgQuery.DoModal();
OnChangleData( here );
UpdateData( false );
}UpdateData()的参数为true时是得到对话框的数据,而false才是向对话框传数据。
另外你应该有一个专门的去绘制图表的函数(且能覆盖掉前次绘制结果),在OnPaint中也是调用这个函数,同时更新数据从画时也调用这个函数从绘,而不要用UpdateWindow和Invalidate,因为这样不管你用不用双缓冲都会闪的。
两次就会有一次能刷过来!
{
//Do Some initialize here,Such as Select Font,Pen ECt...
GetDataFromDB( strFilter );
DrawYValue(pDC,m_MaxUnit.fU,m_MaxUnit.fI,m_MaxUnit.fW,m_MaxUnit.fP,m_MaxUnit.fT,m_bPrintFlag);
//Draw others;
};
就是DrawYValue时出错,还用了以前的变量的位置,DrawYValue 如下
void CWbxcqView::DrawYValue(CDC *pDC, double m_maxU, double m_maxI, double m_maxW, double m_maxP, double m_maxRMP, BOOL m_bPrintFlag)
{
CString strTemp;
//U
pDC->SetTextColor( clrDraw[BLUE] );//Select pen color;
for (int i=0;i<=10 && bDrawCurve[0];i++)
//bDrawCurve: If this curve be drawed
{
strTemp.Format("4.2f",i*m_MaxUnit.fU/10.0);//convert
pDC->TextOut(m_nXUint+m_nXPos[0],m_nDataB- i*m_yScale , strTemp );
}
//... Draw other six , as the same codes;
}
m_nXPos 的值会在 GetDataFromDB中得到;
然后再DrawYValue的,为什么就会出错呢?
or
开线程画!!!用MFC如何高效地绘图TouchMe 显示图形如何避免闪烁,如何提高显示效率是问得比较多的问题。
而且多数人认为MFC的绘图函数效率很低,总是想寻求其它的解决方案。
MFC的绘图效率的确不高但也不差,而且它的绘图函数使用非常简单,
只要使用方法得当,再加上一些技巧,用MFC可以得到效率很高的绘图程序。
我想就我长期(呵呵当然也只有2年多)使用MFC绘图的经验谈谈
我的一些观点。1、显示的图形为什么会闪烁?
我们的绘图过程大多放在OnDraw或者OnPaint函数中,OnDraw在进行屏
幕显示时是由OnPaint进行调用的。当窗口由于任何原因需要重绘时,
总是先用背景色将显示区清除,然后才调用OnPaint,而背景色往往与绘图内容
反差很大,这样在短时间内背景色与显示图形的交替出现,使得显示窗口看起来
在闪。如果将背景刷设置成NULL,这样无论怎样重绘图形都不会闪了。
当然,这样做会使得窗口的显示乱成一团,因为重绘时没有背景色对原来
绘制的图形进行清除,而又叠加上了新的图形。
有的人会说,闪烁是因为绘图的速度太慢或者显示的图形太复杂造成的,
其实这样说并不对,绘图的显示速度对闪烁的影响不是根本性的。
例如在OnDraw(CDC *pDC)中这样写:
pDC->MoveTo(0,0);
pDC->LineTo(100,100);
这个绘图过程应该是非常简单、非常快了吧,但是拉动窗口变化时还是会看见
闪烁。其实从道理上讲,画图的过程越复杂越慢闪烁应该越少,因为绘图用的
时间与用背景清除屏幕所花的时间的比例越大人对闪烁的感觉会越不明显。
比如:清楚屏幕时间为1s绘图时间也是为1s,这样在10s内的连续重画中就要闪
烁5次;如果清楚屏幕时间为1s不变,而绘图时间为9s,这样10s内的连续重画
只会闪烁一次。这个也可以试验,在OnDraw(CDC *pDC)中这样写:
for(int i=0;i<100000;i++)
{
pDC->MoveTo(0,i);
pDC->LineTo(1000,i);
}
呵呵,程序有点变态,但是能说明问题。
说到这里可能又有人要说了,为什么一个简单图形看起来没有复杂图形那么
闪呢?这是因为复杂图形占的面积大,重画时造成的反差比较大,所以感觉上要
闪得厉害一些,但是闪烁频率要低。
那为什么动画的重画频率高,而看起来却不闪?这里,我就要再次强调了,
闪烁是什么?闪烁就是反差,反差越大,闪烁越厉害。因为动画的连续两个帧之间
的差异很小所以看起来不闪。如果不信,可以在动画的每一帧中间加一张纯白的帧,
不闪才怪呢。
2、如何避免闪烁
在知道图形显示闪烁的原因之后,对症下药就好办了。首先当然是去掉MFC
提供的背景绘制过程了。实现的方法很多,
* 可以在窗口形成时给窗口的注册类的背景刷付NULL
* 也可以在形成以后修改背景
static CBrush brush(RGB(255,0,0));
SetClassLong(this->m_hWnd,GCL_HBRBACKGROUND,(LONG)(HBRUSH)brush);
* 要简单也可以重载OnEraseBkgnd(CDC* pDC)直接返回TRUE
这样背景没有了,结果图形显示的确不闪了,但是显示也象前面所说的一样,
变得一团乱。怎么办?这就要用到双缓存的方法了。双缓冲就是除了在屏幕上有
图形进行显示以外,在内存中也有图形在绘制。我们可以把要显示的图形先在内存中
绘制好,然后再一次性的将内存中的图形按照一个点一个点地覆盖到屏幕上去(这个
过程非常快,因为是非常规整的内存拷贝)。这样在内存中绘图时,随便用什么反差
大的背景色进行清除都不会闪,因为看不见。当贴到屏幕上时,因为内存中最终的图形
与屏幕显示图形差别很小(如果没有运动,当然就没有差别),这样看起来就不会闪。
3、如何实现双缓冲
首先给出实现的程序,然后再解释,同样是在OnDraw(CDC *pDC)中: CDC MemDC; //首先定义一个显示设备对象
CBitmap MemBitmap;//定义一个位图对象 //随后建立与屏幕显示兼容的内存显示设备
MemDC.CreateCompatibleDC(NULL);
//这时还不能绘图,因为没有地方画 ^_^
//下面建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小
MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight);
//将位图选入到内存显示设备中
//只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上
CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap); //先用背景色将位图清除干净,这里我用的是白色作为背景
//你也可以用自己应该用的颜色
MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255)); //绘图
MemDC.MoveTo(……);
MemDC.LineTo(……);
//将内存中的图拷贝到屏幕上进行显示
pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY); //绘图完成后的清理
MemBitmap.DeleteObject();
MemDC.DeleteDC();上面的注释应该很详尽了,废话就不多说了。
4、如何提高绘图的效率
我主要做的是电力系统的网络图形的CAD软件,在一个窗口中往往要显示成千上万个电力元件,而每个元件又是由点、线、圆等基本图形构成。如果真要在一次重绘过程重画这么多元件,可想而知这个过程是非常漫长的。如果加上了图形的浏览功能,鼠标拖动图形滚动时需要进行大量的重绘,速度会慢得让用户将无法忍受。怎么办?只有再研究研究MFC的绘图过程了。
实际上,在OnDraw(CDC *pDC)中绘制的图并不是所有都显示了的,例如:你
在OnDraw中画了两个矩形,在一次重绘中虽然两个矩形的绘制函数都有执行,但是很有可能只有一个显示了,这是因为MFC本身为了提高重绘的效率设置了裁剪区。裁剪区的作用就是:只有在这个区内的绘图过程才会真正有效,在区外的是无效的,即使在区外执行了绘图函数也是不会显示的。因为多数情况下窗口重绘的产生大多是因为窗口部分被遮挡或者窗口有滚动发生,改变的区域并不是整个图形而只有一小部分,这一部分需要改变的就是pDC中的裁剪区了。因为显示(往内存或者显存都叫显示)比绘图过程的计算要费时得多,有了裁剪区后显示的就只是应该显示的部分,大大提高了显示效率。但是这个裁剪区是MFC设置的,它已经为我们提高了显示效率,在进行复杂图形的绘制时如何进一步提高效率呢?那就只有去掉在裁剪区外的绘图过程了。可以先用pDC->GetClipBox()得到裁剪区,然后在绘图时判断你的图形是否在这个区内,如果在就画,不在就不画。
如果你的绘图过程不复杂,这样做可能对你的绘图效率不会有提高。
平时即画到memory dc又画到屏幕上,
OnPaint时把memory dc BitBlt到屏幕上
2.闪烁是因为重画背景,a.Invalidate(false);b.楼上
3.Invalidate();不会马上执行OnPaint,只是在消息队列里放WM_PAINT消息,
系统一般在有空闲时才执行该消息
再看一看些代码好了:void CWbxcqView::OnDraw(CDC* pDC)
{
//Do Some initialize here,Such as Select Font,Pen ECt...
GetDataFromDB( strFilter );
DrawYValue(pDC,m_MaxUnit.fU,m_MaxUnit.fI,m_MaxUnit.fW,m_MaxUnit.fP,m_MaxUnit.fT,m_bPrintFlag);
//Draw others;
};
就是DrawYValue时出错,还用了以前的变量的位置,DrawYValue 如下
void CWbxcqView::DrawYValue(CDC *pDC, double m_maxU, double m_maxI, double m_maxW, double m_maxP, double m_maxRMP, BOOL m_bPrintFlag)
{
CString strTemp;
//U
pDC->SetTextColor( clrDraw[BLUE] );//Select pen color;
for (int i=0;i<=10 && bDrawCurve[0];i++)
//bDrawCurve: If this curve be drawed
{
strTemp.Format("4.2f",i*m_MaxUnit.fU/10.0);//convert
pDC->TextOut(m_nXUint+m_nXPos[0],m_nDataB- i*m_yScale , strTemp );
}
//... Draw other six , as the same codes;
}
m_nXPos 的值会在 GetDataFromDB中得到;
然后再DrawYValue的,为什么就会出错呢