类似迅雷的悬浮窗口

 只大概说一下实时曲线如何实现:

因为同时可能有几个任务在下载,所以要用定时器控制轮流切换每个任务的状态。

主体思路是:

1:为每个任务创建下面一些东西

设备兼容DC :CreateCompatibleDC

设备兼容的位图: CreateCompatibleBitmap

把位图选入DC :SelectObject

之后画进度图都在这个DC上画 所以你也可以选入一些不同的Brush pen 之类的东西 以便让每个任务的进度图有不同的颜色背景。

上面的DC创建好后把它加入一个map

map 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里。)

第一次不要贴满,给最右边留一个画线的地方,画完线后这个图就算画满了。然后贴到真实窗口上。

 

 

 

 

 

 


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部