位图进度条
作者:徐云飞
下载本文示例源代码
玩过破天的朋友知道,游戏更新时进度是用位图表示的,我觉的挺漂亮的,于是自己动手做了一个类来实现那种效果。
这个类的名字叫CBmpProgCtrl,继承于CStatic,使用方法如下。
1、首先要将BmpProgCtrl.h和BmpProgCtrl.cpp添加到工程中。
2、导入两幅位图,作为前景和背景。资源标识分别为IDB_FORE和IDB_BACK.
3、在对话框上,放置一个"Static Text"控件,修改其ID,只要不是默认的IDC_STATIC就可以了。
4、让这个控件和一个Control类型的变量关联,如变量名可以叫m_bmpprog。
5、找到该变量定义的地方,应该是CStatic m_bmpprog,修改CStatic为CBmpProgCtrl。并将头文件BmpProgCtrl.h包含进来。
6、调用该类的方法。
类成员方法介绍:
void GetRange(int &lower,int &upper)返回进度条范围。
int GetPos()获得当前位置
int StepIt( )以当前步长使进度条增长
int SetStep( int nStep )设置步长
int SetPos( int nPos )设置位置
void SetRange( int nLower, int nUpper )设置进度条范围。
具体的可以看源代码。你可以修改它以符合自己的需要。你可能觉的这些方法很熟悉,是的,我参考了CProgressCtrl的方法名。
结束语
这个东西,比较简单,你可以很容易就使用。
原类有个bug:就是在显示滚动的时候会闪烁,这是因为背景图片放入了OnPaint内不断地刷新。 可以把背景放入OnEraseBkgnd内实现,并且最后reuturn true; 前景在OnPaint内实现,即可解决! ( fireway2008 发表于 2009-7-13 11:22:00) 尊敬的用户: 您好! 代码之音「http://www.code1234567.com/」——全球开放源代码搜寻中心,为软件开发人员提供最全面、最准确的软件源代码搜寻服务。搜寻内容涉及ASP,PHP,.NET,JSP,JAVA,VC,VB,Delphi,PB等领域。 代码之音「http://www.code1234567.com/」敬上! ( code1234567 发表于 2009-6-10 17:39:00) 为什么我调用的时候第一次可以,第二次点ButtonStart却没有了呢?图片是第一次跑完的图片!~ ////////////////////////////////////////////shizhixin:这个我尝试,没成功 void CBmpProgressDemoDlg::OnButtonStart() { GetDlgItem(IDC_BUTTON_START)->EnableWindow(FALSE); // 开始无效 m_Progress = 0; m_TotProgress = 5; m_Static_BmpPro.SetRange(m_Progress, m_TotProgress); m_Static_BmpPro.SetPos(0); m_Static_BmpPro.StepIt(); AfxBeginThread((AFX_THREADPROC)InitProgress, this); } DWORD InitProgress(LPVOID pParam) { CBmpProgressDemoDlg * pDlg = (CBmpProgressDemoDlg *)pParam; pDlg->ProgressControl(); return TRUE; } void CBmpProgressDemoDlg::ProgressControl() { for (UINT i=0; i<m_TotProgress; i++) { Sleep(300); AddProgress(); } GetDlgItem(IDC_BUTTON_START)->EnableWindow(TRUE); // 开始有效 } void CBmpProgressDemoDlg::AddProgress() { if ((++m_Progress) <= m_TotProgress) { m_Static_BmpPro.SetPos(m_Progress); m_Static_BmpPro.StepIt(); } } /////////////////////////////// shizhixin: |
为什么我调用的时候第一次可以,第二次点ButtonStart却没有了呢?图片是第一次跑完的图片!~
再次调用的时候要初始化图片以及pos
void CBmpProgCtrl::InitProg()
{
m_nLower = 1;
m_nUpper = 100;
m_nStep = 1;
m_nPos = 0;
bmpBack.Detach();//如果不附加再次loadbitmap会有问题,没有释放bitmap!!
bmpFore.Detach();
bmpBack.LoadBitmap(IDB_BACK);
bmpFore.LoadBitmap(IDB_FORE);
Invalidate();
m_nBackCor=1;
}