一个有关动态绘图的问题。200分送上,解决了再开贴加分(一次只能加100分呀)

hjw 2002-04-18 02:05:52
程序运行后动态输出一些数。要根据这些数动态绘出曲线,但不知道数究竟有多少。如webzip里的下载曲线一样。我想让他动态移动。还有netants里的下载曲线。都是那样的!

哪位大侠肯指教一下,究竟如何实现。急呀!!!200分送上。还可以再加。。。。。。。。。。。救救我呀!!!!!!
...全文
62 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
robothn 2002-04-22
  • 打赏
  • 举报
回复
(CCurveThread*)AfxBeginThread(...) 启动的是哪一个'线程'函数
~~~
把Doprocess()放进去,
访问数据问题:
传一个主线程的指针作参数
同步问题:
用一个CCriticalSection,用法见联机帮助
winne_ll 2002-04-19
  • 打赏
  • 举报
回复
我这里有两个源程序。
都是动态移动的。
wine_ll@sina.com
lyy_hill 2002-04-19
  • 打赏
  • 举报
回复
http://www.codeguru.com
上面有一个很好的类就是绘动态曲线的。你去找找吧。
hjw 2002-04-19
  • 打赏
  • 举报
回复
那样它能访问这个程序里的所有数据吗?以及函数?我是初学者,对这方面还不太清楚。请赐教!
robothn 2002-04-19
  • 打赏
  • 举报
回复
Doprocess 放在另一个线程里
hjw 2002-04-19
  • 打赏
  • 举报
回复
还有。如果我一个程序胡执行时是不是程序就不接受消息?
Doprocess过程执行的时候(时间很长),OnTimer()怎么接受不到呢?望指教。是不是我应该再开一个线程呀????
hjw 2002-04-19
  • 打赏
  • 举报
回复
lyy_hill全是英文呀。。

我用了两个线程,结果执行的让我吃惊呀。~~

CCurveThread *pThread=(CCurveThread *)AfxBeginThread(....)
pThread->ResumeThread();
Doprocess();
结果是先执行Doprocess()然后才执行我的pThread里的OnTimer()函数。怎么回事呀。!!~~
hjw 2002-04-18
  • 打赏
  • 举报
回复
我只想动态画制。因为计算过程很长。我只想给软件的界面一个不单调的设想!!!这样能实现吗??比如说webzip的那个下载动态曲线!就是那样实现的。。应该能实现吧!!cz所说的栈是一个好办法!!我回去试试!!!

谢谢几位了!!
kkk16 2002-04-18
  • 打赏
  • 举报
回复
你应该先将数据确定,然后再根据数据的变化画图。
cz 2002-04-18
  • 打赏
  • 举报
回复
你的数据是无限的,所以只能画一部分。
你维护的要绘制的数据是一个动态队列,不用移动绘制,只用移动数据
就有动态移动的效果。

比如队列满了,最早的数据出队,新数据入队,这不就动态移动了吗?
hjw 2002-04-18
  • 打赏
  • 举报
回复
动态移动怎么 办?就是如果曲线过了横或纵坐标系的一半我要让向前移动一段距离。
yanglx 2002-04-18
  • 打赏
  • 举报
回复
看看下面我编的波表

void CWaveCtrl::TimerWave(PBYTE p,int num)
{
ASSERT(p);
CRect rcClient;
GetClientRect(rcClient);

CClientDC dc(this);

CBitmap Bitmap;
CBitmap* pbmOld = NULL;

CDC dcMem;
dcMem.CreateCompatibleDC(&dc);
Bitmap.CreateCompatibleBitmap(&dc,rcClient.right,rcClient.bottom);
pbmOld = dcMem.SelectObject(&Bitmap);

dcMem.PatBlt(0, 0,rcClient.right, rcClient.bottom, BLACKNESS);

CPen* pOldPen;
CPen pen (PS_SOLID, 0, RGB(0,255,0));
pOldPen = dcMem.SelectObject(&pen);

int x;
for(int i = 0; i < rcClient.Width(); ++i)
{
x = *p;
if (x < 128)
x = 0;
else
x -= 128;
dcMem.MoveTo (rcClient.left + i, rcClient.top + (rcClient.Height()/2) - x/2);
dcMem.LineTo (rcClient.left + i, rcClient.top + (rcClient.Height()/2) + x/2);
p++;
}
dcMem.MoveTo (rcClient.left,rcClient.top+rcClient.Height()/2);
dcMem.LineTo (rcClient.right,rcClient.top+rcClient.Height()/2);

dc.BitBlt(0,0,rcClient.right,rcClient.bottom,&dcMem, 0, 0, SRCCOPY);
dcMem.SelectObject(pOldPen);
dcMem.SelectObject(pbmOld);
dcMem.DeleteDC();
}
cz 2002-04-18
  • 打赏
  • 举报
回复
漏了一句:
在每次采样和内存DC绘制结束后,把内存DC的内容显示到屏幕上。
cz 2002-04-18
  • 打赏
  • 举报
回复
准备一个内存DC,
设定一个定时器,每隔一段时间采样一次,得到一个点数据,
把这个数据画在DC中,线段方式可以是折线,也可以根据历史数据平滑,
画到一定时间超出DC宽度时,可以抛弃最早的数据。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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