VC开发的类似FlashGet的下载进度条
程序员文章站
2024-02-25 18:08:51
...
大家可能都觉得FlashGet的下载进度条很酷是吧?想不想开发一个呢?我自己用VC实现了一个,下面是截图:
代码下载地址: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);
}