欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

VC开发的类似FlashGet的下载进度条

程序员文章站 2024-02-25 18:08:51
...

大家可能都觉得FlashGet的下载进度条很酷是吧?想不想开发一个呢?我自己用VC实现了一个,下面是截图:

VC开发的类似FlashGet的下载进度条

代码下载地址:http://download.csdn.net/download/toshiba689/10261734

下面讲一下实现思路。

 首先,定义几个变量:

typedef struct{
  int start;
  int end;
}BLUE;
BLUE b[3];
CImageList imagelist;

其中BLUE结构体表示一个连续颜色进度条的起始点和结束点坐标,坐标是一个索引值,由0开始。上面定义了一个数组b[3],表示将进度条分成三段,后面会赋值这个数组,设置每一段的开始和结束坐标。还有我定义了一个CImageList变量,这个是用来存储珠子形状的图标,我的程序中会向这个imagelist里面插入3种不同颜色的“珠子”。

   创建CImageList和添加“珠子”的代码如下:

	imagelist.Create(12,12,0,4,4);
	CBitmap blue;
	CBitmap gray;
	CBitmap red;
	blue.LoadBitmap(IDB_BLUE);
	gray.LoadBitmap(IDB_GRAY);
	red.LoadBitmap(IDB_RED);

	imagelist.Add(&blue,CLR_NONE);
	imagelist.Add(&gray,CLR_NONE);
	imagelist.Add(&red,CLR_NONE);

程序中显示“珠子”的区域是一个CScrollView视图,需要重载它的OnDraw函数来实现绘图:

void CRollView::OnDraw(CDC* pDC)
{
	CRollDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here

	CRect rcClient;
    GetClientRect(rcClient);

	nColCount = rcClient.Width()/m_nCellWidth;
	nRowCount = m_nCount/nColCount+1;
	m_nViewHeight = nRowCount*m_nCellHeight;

	 CBrush brush(::GetSysColor( COLOR_BTNFACE));
     pDC->FillRect(&rcClient, &brush);
	 
	 pDC->SetBkMode(TRANSPARENT);
	//dc.SetBkColor(RGB(255,0,0));
    
    CRect rect;
	pDC->GetClipBox(&rect);
	//TRACE("top:%d left:%d width:%d height:%d\n",rect.top,rect.left,rect.Width(),rect.Height());
    
	for(int i=0;i<=m_nCount;i++){
   			int x= i%nColCount;
			int y = i/nColCount;
			DrawBrick(pDC,x,y,0);
	}
	int i, j;	
	for(i=0;i<3;i++){
        for(j=b[i].start;j<b[i].end;j++){
			int x= j%nColCount;
			int y = j/nColCount;
			DrawBrick(pDC,x,y,1);
        }
			DrawBrick(pDC,j%nColCount,j/nColCount,2);
	}
	/*
   	 dc.BitBlt(0, 0, rcClient.Width(), rcClient.Height(),
		&m_MemDC, 
		0, 0, 
		SRCCOPY);
		*/
		
}
void CRollView::DrawBrick(CDC* pDC,int col,int row,int color)
{
	if(color==1)
	  imagelist.Draw(pDC,0,CPoint(col*m_nCellWidth,row*m_nCellHeight),ILD_TRANSPARENT);
	else if(color==0)
	  imagelist.Draw(pDC,1,CPoint(col*m_nCellWidth,row*m_nCellHeight),ILD_TRANSPARENT);
	else
	  imagelist.Draw(pDC,2,CPoint(col*m_nCellWidth,row*m_nCellHeight),ILD_TRANSPARENT);
}

还有,我的程序实现了一个自动滚动“珠子”的动画效果,通过在定时器中增加每段进度的末点坐标的值,这样每段珠子的长度就会不断变长了。OnTimer函数代码如下:

void CRollView::OnTimer(UINT nIDEvent) 
{
	CClientDC dc(this);
    OnPrepareDC(&dc);

	for(int i=0;i<3;i++){
		    int x= b[i].end %nColCount;
			int y = b[i].end/nColCount;
			DrawBrick(&dc,x,y,1);

	        b[i].end +=1;

	 	     x= b[i].end %nColCount;
			y = b[i].end/nColCount;
			DrawBrick(&dc,x,y,2);
	}
  	//Invalidate();

	CScrollView::OnTimer(nIDEvent);
}