只大概说一下实时曲线如何实现:
因为同时可能有几个任务在下载,所以要用定时器控制轮流切换每个任务的状态。
主体思路是:
1:为每个任务创建下面一些东西
设备兼容DC :CreateCompatibleDC
设备兼容的位图: CreateCompatibleBitmap
把位图选入DC :SelectObject
之后画进度图都在这个DC上画 所以你也可以选入一些不同的Brush pen 之类的东西 以便让每个任务的进度图有不同的颜色背景。
上面的DC创建好后把它加入一个map
map<struct ,CDC *> m_taskMap;
struct 里可以包含任务ID, 任务下载速度,这个结构需要你定时去取相关值来填充的。画图时候需要的信息就来自这个结构。
准备一个画图函数draw()
在定时器里调用这个函数 里面循环给Map里保存的每一个CDC画图(bitblt)
比如你要画图的DC的大小是10*10
for(iterater pos = m_taskmap.begin(); pos != m_taskMap.end(); pos++)
{
pos->second->Bitblt(0,0,10,10,pos->second,1,10,SRCCPY); //注意有一个1
这样最右边就留有十分之一的面积是空白的。这个空白的地方留给你画最近一个时间间隔下载速度的值。
pos->second->MoveTo(ClientRc.right-1,ClientRc.bottom);
pos->second->LineTo(ClientRc.right-1,struct->pos);
这就在每个任务的DC的最右边画了一条线
最后在onPaint()里再贴一次图
CPaintDC dc(this);
把图贴到实际的窗口上
dc.BitBlt(0,0,ClientRc.width(),ClientRc.hight(),m_MemDC,0,0,SCRCPY);
m_MemDC = m_TaskMap->second的某一个。由你自己决定。
(一共贴2次图,一次在你的Draw函数里,一次在onPaint里。)
第一次不要贴满,给最右边留一个画线的地方,画完线后这个图就算画满了。然后贴到真实窗口上。