码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-02-07 15:56:54      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:

使用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);
	}
}
这个小例只是做了界面的处理部分,没有什么实际的功能。你如果需要做下载管理,可以在里面扩展下载部分。

程序运行截图:

技术分享

技术分享

提供源码下载:

下载源码



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

标签:

原文地址:http://blog.csdn.net/mfcing/article/details/43603525

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!