类似迅雷的悬浮窗口

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

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

主体思路是:

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

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

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值