分享一个Duilib配置的下载器小例

使用DuiLib开发Windows界面实在是太简单了,对于MFC程序员真的是脱离苦海,控件自绘什么的GDI\GDI+真要把人搞死。DuiLib是国内一个非常有名的开源界面库,目前很多软件都是用了它(百度卫士、杀毒、PPS……),感谢开源的前辈们。

扩展列表控件的滚动消息,加上一个定时器,让他可以自动滚动一段再停下来。

void CDownloadListUI::DoEvent( TEventUI& event )
{
	if( !IsMouseEnabled() && event.Type > UIEVENT__MOUSEBEGIN && event.Type < UIEVENT__MOUSEEND ) {
		if( m_pParent != NULL ) m_pParent->DoEvent(event);
		else CTileLayoutUI::DoEvent(event);
		return;
	}

	if( event.Type == UIEVENT_TIMER && event.wParam == SCROLL_TIMERID )
	{
		if( (m_uButtonState & UISTATE_CAPTURED) != 0 ) {
			POINT pt = m_pManager->GetMousePos();
			LONG cy = (pt.y - m_ptLastMouse.y);
			m_ptLastMouse = pt;
			SIZE sz = GetScrollPos();
			sz.cy -= cy;
			SetScrollPos(sz);
			return;
		}
		else if( m_dwDelayLeft > 0 ) {
			--m_dwDelayLeft;
			SIZE sz = GetScrollPos();
			LONG lDeltaY =  (LONG)(CalculateDelay((double)m_dwDelayLeft / m_dwDelayNum) * m_dwDelayDeltaY);
			if( (lDeltaY > 0 && sz.cy != 0)  || (lDeltaY < 0 && sz.cy != GetScrollRange().cy ) ) {
				sz.cy -= lDeltaY;
				SetScrollPos(sz);
				return;
			}
		}
		m_dwDelayDeltaY = 0;
		m_dwDelayNum = 0;
		m_dwDelayLeft = 0;
		m_pManager->KillTimer(this, SCROLL_TIMERID);
		return;
	}
	if( event.Type == UIEVENT_SCROLLWHEEL )
	{
		LONG lDeltaY = 0;
		if( m_dwDelayNum > 0 ) lDeltaY =  (LONG)(CalculateDelay((double)m_dwDelayLeft / m_dwDelayNum) * m_dwDelayDeltaY);
		switch( LOWORD(event.wParam) ) {
		case SB_LINEUP:
			if( m_dwDelayDeltaY >= 0 ) m_dwDelayDeltaY = lDeltaY + 8;
			else m_dwDelayDeltaY = lDeltaY + 12;
			break;
		case SB_LINEDOWN:
			if( m_dwDelayDeltaY <= 0 ) m_dwDelayDeltaY = lDeltaY - 8;
			else m_dwDelayDeltaY = lDeltaY - 12;
			break;
		}
		if( m_dwDelayDeltaY > 100 ) m_dwDelayDeltaY = 100;
		else if( m_dwDelayDeltaY < -100 ) m_dwDelayDeltaY = -100;
		m_dwDelayNum = (DWORD)sqrt((double)abs(m_dwDelayDeltaY)) * 5;
		m_dwDelayLeft = m_dwDelayNum;
		m_pManager->SetTimer(this, SCROLL_TIMERID, 50U);
		return;
	}
	CTileLayoutUI::DoEvent(event);
}

首先是添加节点到列表控件中,为了在后面对每个节点的点击事件进行区分,我们需要唯一标识每个节点里的控件,这里我是用控件名称来标识的。

void CDownloadListUI::AddItem()
{
	CDialogBuilder builder;
	CContainerUI* pItem=static_cast<CContainerUI*>(builder.Create(L"Item_load.xml", 0));
	if ( pItem )
	{
		int i=GetCount();
		CDuiString strText;
		strText.Format(L"%02d", i+1);
		CControlUI* pControl=pItem->GetItemAt(0);
		if ( pControl )
			pControl->SetText(strText);
		pControl=pItem->GetItemAt(2);
		CProgressUI* pProgress=(CProgressUI*)pControl->GetInterface(L"Progress");
		if ( pProgress )
			pProgress->SetValue(i+1);
		pControl=pItem->GetItemAt(3);
		if ( pControl )
		{
			strText.Format(L"%d%%", i+1);
			pControl->SetText(strText);
		}
		pControl=pItem->GetItemAt(4);
		if ( pControl )
			pControl->SetText(L"正在下载");
		pControl=pItem->GetItemAt(5);
		if ( pControl )
		{
			strText.Format(L"BtnLoad1%d", i);
			pControl->SetName(strText);
			pControl->SetTag(i);
		}
		pControl=pItem->GetItemAt(6);
		if ( pControl )
		{
			strText.Format(L"BtnLoad2%d", i);
			pControl->SetName(strText);
			pControl->SetTag(i);
		}
		pControl=pItem->GetItemAt(7);
		if ( pControl )
		{
			strText.Format(L"BtnLoad3%d", i);
			pControl->SetName(strText);
			pControl->SetTag(i);
		}
		Add(pItem);
	}
}

因此在点击事件的判断里,我只需要对比前面几个字符就可以对消息进行分发了:

void CMainWnd::OnClick( TNotifyUI& msg )
{
	if ( wcsncmp(msg.pSender->GetName(), L"BtnLoad1", 8)==0 )
		OnBtnCancel(msg);
	else if ( wcsncmp(msg.pSender->GetName(), L"BtnLoad2", 8)==0 )
		OnBtnPause(msg);
	else if ( wcsncmp(msg.pSender->GetName(), L"BtnLoad3", 8)==0 )
		OnBtnContinue(msg);
	else if ( wcsncmp(msg.pSender->GetName(), L"BtnFinish", 9)==0 )
		OnBtnDelete(msg);
	CWindowBase::OnClick(msg);
}

分发消息处理函数里,我需要知道到底点击的是那个节点上的控件,这时候我们前面设置的Tag就有用了:

void CMainWnd::OnBtnCancel( TNotifyUI& msg )
{
	int nIndex=msg.pSender->GetTag();
	int nCount=m_pDownloadList->GetCount();
	if ( nIndex<0 || nIndex>=nCount )
		return ;
	m_pDownloadList->RemoveAt(nIndex);
	for ( int i=0; i<nCount; ++i )
	{
		CContainerUI* pLayout=static_cast<CContainerUI*>(m_pDownloadList->GetItemAt(i));
		if ( pLayout==NULL )
			continue;
		CControlUI* pBtn=pLayout->GetItemAt(5);
		if ( pBtn )
			pBtn->SetTag(i);
		pBtn=pLayout->GetItemAt(6);
		if ( pBtn )
			pBtn->SetTag(i);
		pBtn=pLayout->GetItemAt(7);
		if ( pBtn )
			pBtn->SetTag(i);
	}
}

这个小例只是做了界面的处理部分,没有什么实际的功能。你如果需要做下载管理,可以在里面扩展下载部分。

程序运行截图:

提供源码下载:

下载源码

时间: 2024-10-10 06:27:05

分享一个Duilib配置的下载器小例的相关文章

CentOS7.5安裝配置多协议下载器Aria2

一.搭建 Aria2 以及 AriaNg Web UI 选择使用Docker 参考 aria2-ariang-docker 以及 aria2-ariang-x-docker-compose 二.配置aria2.conf(可跳過) 这个文件是从作者地 Github下载下来的,主要加了代理,而这个代理是 sock5 通过 privoxy #所有协议代理 all-proxy=http://192.168.6.113:8118 #用户名 #rpc-user=user #密码 #rpc-passwd=pa

在firefox的flashgot中配置各种下载器

1.配置multiget为下载器 可执行路径:$HOME/opt/bin/multiget参数模板:[url=URL]空格[refer=REFERER] 2.配置lftp为下载器可执行路径:/usr/bin/xterm参数模板:-e /usr/bin/lftp -c pget -n -c 8 [URL] -o [FOLDER] 3.若用gnome-terminal则参数模板为:--hide-menubar -x /usr/bin/lftp -c pget -n 8 -c [URL] -o [FO

分享一个刷网页PV的python小脚本

下面分享一个小脚本,用来刷网页PV. [[email protected] ~]# cat www.py #!/usr/bin/python# coding: UTF-8import webbrowser as webimport timeimport osimport randomdata = raw_input('请输入网址:')count = random.randint (3,5)j = 0while j <count: i = 0 while i <= 3: web.open_new

分享一个Cisco IOS的下载网站

大家都知道思科的IOS下载是需要权限的,普通注册个账户还不行,下面分享个网站,上面有分享各个版本的IOS下载,自己在初接触 Cisco Catalyst 3560G-24TS Switch 的时候找到的: http://sfree.ws/

使用libcurl下载文件小例

libcurl是一个很强大的开源网络处理库,支持包括HTTP.HTTPS.FTP--一系列网络协议.用它来进行HTTP的get\post 或者下载文件更是小菜一碟,chrome内核都用到了它,本文主要讲解一个使用curl下载文件的小例. 首先是去下载curl的最新源代码,然后编译成动态库或者静态库:然后把头文件和库文件拿出来加入到我们自己的工程中,引用声明: #include "curl.h" #ifdef _DEBUG #pragma comment(lib, "../De

分享一个很早之前写的小工具DtSpyPlus

几年前写的一个获取windows窗体基本信息和屏幕取色的小工具 ,一直在用. 下载地址 http://files.cnblogs.com/dint/SpyPlus.zip

“挖掘机”升级路 二篇(04)--分享一个自动配置的脚本

掰着指头算算,今天是周三,也就意味着我从接触Hadoop到搭建集群Hadoop.HBase.Hive已经过去了四天,结果是我依然没有搭建完成,还在苦苦挣扎.这周一定要让完整的Hadoop跑起来,不然也真是太不像话了. 今天我想想干了些啥,早上路过青年路的时候买了个馒头,他居然要了我两块钱!!!不是什么营养馒头,就是路边摊.一笔带过,发泄一下. 今天的工作要分为两段来说,早上是自己接着在研究HBase的集群配置,遇到的主要问题就是两个,第一个就是当我配置slave机器的时候,在hbase-site

&lt;转&gt;USB Blaster下载器驱动程序安装教程

对于FPGA的开发而言,除了需要安装Quartus II软件外,还需要安装USB Blaster下载器.USB Blaster下载器为Altera的FPGA/CPLD程序下载电缆,通过计算机的USB接口可对Altera的FPGA/CPLD以及配置芯片进行编程.调试等操作.USB-Blaster下载器的驱动来自Quartus II软件,Altera在每一个新版本的软件中,均提供驱动的安装包.USB Blaster下载器通过PC USB端口的连接,完成对Altera器件进行配置或者编程,以及其他的一

分享一个近期写的简单版的网页采集器

分享一个近期写的简单版的网页采集器 功能特点: 1.可通过配置,保存采集规则. 2.可通过采集规则,进行数据采集. 3.可分页,分关键字,进行采集. 4.可保存数据至数据库,文本中. ........... 功能还比较简单,喜欢深入的可以继续深入下去,暂时还没有登录的功能,因为登录功能涉及到的范围比较广,待日后慢慢研究后再开发. 我先上个图让大家一睹为快吧: 首先看看页面,我们要采集这个网站的文章 接下来,首先是查找分页,获得分页里面的文章链接,接着查找内容页需要采集的字段,生成规则,进行采集.