我现在想试着写一个进度条控件,但是这个进度条是一个无确切进度的,也就是一直循环播放的形式,即:从0到FULL后又重新回到0,如此循环进行。其主要功能就是在无法获得确切的进度时给用户一个感觉,程序没有死掉。控件对外只提供三个使用的方法:Start(),Suspend(),Stop().
     
     我的思路是这样的:继承static控件,然后在上边画进度条。但是一开始就遇到问题了:我在这个进度条控件类CProgress类中添加OnPaint()函数。在OnPaint函数中写绘制的代码如下:void CProgress::OnPaint() 
{
CPaintDC dc(this); // device context for painting
CRect rc;
GetClientRect(&rc); CDC* pDC = GetWindowDC();
CBitmap* pBitmap = new CBitmap;
BITMAP BmpInfo;
CBitmap* pOldBitmap;
CDC* pDisplayMemDC=new CDC;
pDisplayMemDC->CreateCompatibleDC(pDC); pBitmap->LoadBitmap(IDB_DOWN);
pBitmap->GetBitmap(&BmpInfo);
pOldBitmap = (CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
int i=0;
for(i=0; i<=rc.right; i=i+BmpInfo.bmWidth)
{
GetClientRect(&rc);
pDC->BitBlt(i,rc.bottom,BmpInfo.bmWidth,BmpInfo.bmHeight,pDisplayMemDC,0,0,SRCCOPY);
}
pDisplayMemDC->SelectObject(pOldBitmap);
pBitmap->DeleteObject();
...
         ...
}     当我在对话框中添加STATIC控件,并用CProgress与之关联,结果运行是发现什么都没有?
     请各位高手帮我看看,是我的思路不对,或者是这种思路没有可行性,还是在代码实现上除了问题。如果有更好的思路的话,请不吝赐教!
     在下感激不尽

解决方案 »

  1.   

    动画应该用定时器控制
    而且你可以直接重载CProgressCtrl么
      

  2.   

    是会用到定时器,但是现在第一步就出现问题了,是不是CSTATIC不能使用ONPAINT接受WM_PAINT消息呀,MSDN上也没有说。继承CProgressCtrl不能满足需求。
      

  3.   

    static应该是没问题的
    你应该确定一下OnPaint消息连没连接好
    另外下个断点看看能不能进去
    然后
    CProgressCtrl肯定是没问题的类似的东西我做过
    不过我当时到也没有用CProgressCtrl
    直接做了一个等待对话框
    然后在上面画了个类似QQ登陆的滚动棒
      

  4.   

    注意:添加的static要改一下ID再关联变量
      

  5.   

    1.我不是很明白你指的OnPaint连接好是指什么,我是在wizzard里面直接添加的函数,这个应该是没有问题的。
    2.对,就是像QQ那样的登陆的滚动棒。如果在对话框中是可以画出来的,但是现在在static里面画不出来。你当时是继承的CProgressCtrl做的吗?能不能给我说下你的思路?
      

  6.   

    1. 你的链接应该是没问题的,你看看4楼的回复,static控件的ID不能用默认的
    2. 我没有CProgressCtrl具体思路么其实就是循环贴一个首尾相接的图
      

  7.   

    你在OnPaint下断点看看能不能进去
      

  8.   

    我发现了,在ONPAINT下面有这样一句话:// Do not call CStatic::OnPaint() for painting messages  也就是在这个控件中不能掉这个函数