subject_17100.htm
来自「一些关于vc的问答」· HTM 代码 · 共 144 行 · 第 1/2 页
HTM
144 行
<p>
序号:17100 发表者:liuwenjun 发表日期:2002-10-08 14:32:15
<br>主题:关于动画的请教
<br>内容:请哪位高手帮忙分析一下下面的代码(OnTimer函数中的)在对话框中画动画为何出现下面的结果:开始几下正常(红线出来后就隐没,然后再出来。。),但用不了几次后所画线的上面一部分就不动了,而且如果下次画的线与此部分有重叠的话,重叠部分不显示(其中CurHeightArray数组是我用随机数生成的int数组)。而且当SetTimer(1,500,NULL)时,每次显示的图形都不一样,但若SetTimer(1,100,NULL)时,就有几次显示的是一样的。当我把擦线代码放于画线代码前时,就无动画,而是出现10条黑红色的一样长度的线。<BR> CDC *pDC;<BR> pDC=GetDC();<BR>CPen mypen,*pOldPen;<BR> mypen.CreatePen(PS_SOLID,5,RGB(192,63,63));<BR>// 创建一个红色的补色(要实现红色就要定义其补色的画笔??)实线 pOldPen=pDC->SelectObject(&mypen);<BR> pDC->BeginPath();<BR> int m_pointx,m_pointy;//用来标志画线的起始点<BR> int i=0;<BR> m_pointx=rect.left=20;//rect是客户区矩形<BR> m_pointy=rect.bottom-60;<BR> for(i=0;i<10;i++)//画10条线<BR> {<BR> pDC->MoveTo(m_pointx+15*i,m_pointy);<BR> pDC->LineTo(m_pointx+15*i,CurHeightArray[i]);<BR> }<BR> for(i=0;i<10;i++)<BR> {<BR> PreHeightArray[i]=CurHeightArray[i];<BR> }<BR>pDC->SetROP2(R2_NOTXORPEN);//设置画图模式 <BR> for(i=0;i<10;i++)//重画这10条线,以将其擦去<BR> {<BR> pDC->MoveTo(m_pointx+15*i,m_pointy);<BR> pDC->LineTo(m_pointx+15*i,PreHeightArray[i]);<BR> }<BR>
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:luo 回复日期:2002-10-08 14:42:30
<br>内容:我觉得应该先擦除以前的线,然后在话新的线。还有个问题就是我以前设置画图模式的时候用的是R2_NOT模式,不知道对你是不是有帮助。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:luo 回复日期:2002-10-08 14:49:05
<br>内容:还有不知道你的代码是不是拷完了,我发现你用了BeginPath()方法。但是你没有用EndPath()方法。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:liuwenjun 回复日期:2002-10-08 14:55:06
<br>内容:R2_NOT模式我也用过,但结果是仅出现黑色的线的动画,而不是我想要的红色线。而且,我在理论上想的也是象您一样,先擦除以前的线——也就是我前面说的“把擦线代码放于画线代码前”,但结果是“就无动画,而是出现10条黑红色的一样长度的线”,我就是想不明白这里是怎么回事。不知您是怎样想的?
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:liuwenjun 回复日期:2002-10-08 14:56:55
<br>内容:啊,不好意思,我用了BeginPath()方法,但代码没拷进去。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:luo 回复日期:2002-10-08 15:07:53
<br>内容:你说的有道理,是应该用你选的模式,我建议你这样试一下,还是把擦线的部分放到前面去,但是在话新的线之前在设置一遍模式,这次用R2_NOP或许能行。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:liuwenjun 回复日期:2002-10-08 15:32:07
<br>内容:照您说的这样,我刚才试了一下,可结果一条线都没了。<BR>您不是说您以前也做过类似工作吗,您能找到原代码吗?我现在真是不知如何是好了!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:徐景周 回复日期:2002-10-08 15:44:30
<br>内容:可试下面方法绘制:<BR>//绘制聚焦矩形(逻辑坐标)<BR>void DrawFocusRect(CDC* pDC, const CRect& rect)<BR>{<BR> CPen pen(PS_DOT, 0, RGB(0,0,0));<BR> CPen* pOldPen = pDC->SelectObject(&pen);<BR> int nOldMode = pDC->SetROP2(R2_NOTXORPEN);<BR><BR> pDC->MoveTo(rect.left, rect.top); // 绘制矩形框<BR> pDC->LineTo(rect.right,rect.top);<BR> pDC->LineTo(rect.right,rect.bottom);<BR> pDC->LineTo(rect.left, rect.bottom);<BR> pDC->LineTo(rect.left, rect.top);<BR> // 恢复CDC对象<BR> pDC->SetROP2(nOldMode);<BR> pDC->SelectObject(pOldPen);<BR>}
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:luo 回复日期:2002-10-08 15:47:19
<br>内容:你把那两句BeginPath和EndPath去掉试一下。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:liuwenjun 回复日期:2002-10-08 21:23:39
<br>内容:我试了两位的方法:<BR>1我用徐老师的DrawFocusRect函数(我将他加为对话类的成员函数,然后在OnTimer函数中调用他),结果编译时出错:<BR>error C2039: 'DrawFocusRect' : is not a member of 'CAnimateDlg'<BR> d:\myprojects\animate\animatedlg.h(14) : see declaration of 'CAnimateDlg'<BR>Error executing cl.exe.<BR>2将BeginPath和EndPath去掉后,成了白色线的动画;<BR>另外,我还试了这个方法:先画线,画完线后再用下面语句 <BR> pDC->SelectStockObject(GRAY_BRUSH);<BR> pDC->Rectangle(m_pointx,rect.top,rect.right-1,rect.bottom-60);<BR>想再用画刷将矩形区域填充,但结果还是不行。还请指教!!!<BR><BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:黄飚 回复日期:2002-10-08 21:31:56
<br>内容:我提一下,任何对UI的化图,我建议在OnDraw()OnPaint()进行刷新,否则是不正正常
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:黄飚 回复日期:2002-10-08 21:33:49
<br>内容:在OnTimer里调用<BR><BR>CWnd::Invalidate<BR>void Invalidate( BOOL bErase = TRUE );<BR><BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?