连续播放一系列图片
可能由于使用了计时器SetTimer
导致图片上出现横向带状闪动(不是全屏闪动)怎样解决这个计时器刷屏太快呢?
在线等
谢谢

解决方案 »

  1.   

    横向条带现象一般是因为:画面某个部位的刷新的刹那,恰好赶上了显示器的相同部位的刷新。当然,一般来讲画面刷新太快就会造成这种现象。这在微软出版社出的《Inside DirectX》99年1月的中文版第9章有详尽的论述。他们称之为“撕裂现象”。至于怎么解决?你的问题就好像问身上痒痒怎么办一样。那不是明摆着吗。
      

  2.   

    那就把TIMER搞大点
    不要每次ONTIMER都重绘
      

  3.   

    Timer是多少,另应该使用双缓冲绘图,并且只绘制需要更新的部分。
      

  4.   

    将下一帧的内容显画在一个临时dc上,然后将bitblt过去,而不是在一个dc上画
    还有就是要重载onerasebkgnd方法
    另外就是timer只能精确到15ms左右
      

  5.   

    绘制过程应该是这样做的吧
    这里我画图的过程是使用了别人的一个类 先是用LoadBmpFile    (LPCTSTR m_pstrBmpFileName);将位图载入
    然后用Draw(CDC *pDC);绘制 
    难道主要问题出在Draw函数中吗?
    大家帮小弟看看哦
    谢谢啦类的头文件:
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //
    // STBitmap1.h: interface for the CSTBitmap1 class.
    //
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////#if !defined(STBITMAP_H_INCLUDED)
    #define STBITMAP_H_INCLUDED#if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////#define WIDTHBYTES(i)    ((i+31)/32*4)/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //处理设备无关位图class CSTDIB : public CObject  
    {
    public:
    CSTDIB();
    virtual ~CSTDIB();
    public:
    BOOL CreateRGBDib24K (BYTE *pImageData, int nWidth, int nHeight);
    BOOL CreateGrayDib24K (BYTE *pImageData, int nWidth, int nHeight);
    BOOL SaveAsBmpFile (LPCTSTR pstrBmpName);
    BOOL CreateDib256 (BYTE* pImageData,int nWidth,int nHeight);
    BOOL LoadBmpFile (LPCTSTR m_pstrBmpFileName);
    void Draw (CDC *pDC);
    public:
    LPBITMAPFILEHEADER m_lpBitmapFileHeader;
    LPBITMAPINFOHEADER m_lpBitmapInfoHeader;
        LPBITMAPINFOHEADER/*BYTE**/ m_lpImageData;
    HBITMAP m_hBitmap;
    DWORD  m_dwImageSize;
    DWORD m_dwColorsNum; BOOL m_bFileIsLoaded;
    public:
    //属性访问
    HBITMAP GetHBitmap()
    {
    return m_hBitmap;
    }
    public:
    void DrawEx(CDC *pDC);
    BOOL IsFileLoaded()
    {
    return m_bFileIsLoaded;
    }
    };#endif // !defined(STBITMAP_H_INCLUDED)/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
      

  6.   

    类的实施文件:
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //
    // STBID.cpp: 源代码文件
    //
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////#include "stdafx.h"
    #include "STDIB.h"#ifdef _DEBUG
    #undef THIS_FILE
    static char THIS_FILE[]=__FILE__;
    #define new DEBUG_NEW
    #endif/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //
    // 构造与析构
    //
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////CSTDIB::CSTDIB()
    {
    m_lpImageData = NULL;
    m_lpBitmapFileHeader = NULL;
    m_lpBitmapInfoHeader = NULL;
    m_hBitmap = NULL;
    m_dwImageSize = 0;
    m_dwColorsNum = 0;
    m_bFileIsLoaded = FALSE;
    }CSTDIB::~CSTDIB()
    {
    if(m_lpImageData!=NULL)
    {
    delete[] m_lpImageData;
    }
    if(m_lpBitmapFileHeader != NULL)
    {
    delete[] m_lpBitmapFileHeader;
    }
    if(m_lpBitmapInfoHeader !=NULL)
    {
    delete[] m_lpBitmapInfoHeader;
    }
    if(m_hBitmap!=NULL)
    {
    DeleteObject(m_hBitmap);
    }
    }///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////绘制DIB
    void CSTDIB::Draw(CDC *pDC)
    {
    if(m_hBitmap != NULL)

    CDC dcMemDC;
    dcMemDC.CreateCompatibleDC(pDC);
    SelectObject(dcMemDC.m_hDC, m_hBitmap); 
    pDC->BitBlt(0,0,m_lpBitmapInfoHeader->biWidth,m_lpBitmapInfoHeader->biHeight,&dcMemDC,0,0,SRCCOPY );
    }
    else
    {
    m_hBitmap = CreateDIBitmap(
    pDC->m_hDC, // CDC句柄
    (LPBITMAPINFOHEADER)m_lpImageData, // 指向图像信息头
    (LONG)CBM_INIT, // 初始化选项
    (LPSTR)m_lpImageData+sizeof(BITMAPINFOHEADER)+m_dwColorsNum*sizeof(RGBQUAD),// 图像数据区
    (LPBITMAPINFO)m_lpImageData, // 指向图像信息
    DIB_RGB_COLORS // 调色板RGB定义
      );
    if(m_hBitmap != NULL)
    {
    CDC dcMemDC;
    dcMemDC.CreateCompatibleDC(pDC);
    SelectObject(dcMemDC.m_hDC, m_hBitmap); 
    pDC->BitBlt(0,0,m_lpBitmapInfoHeader->biWidth,m_lpBitmapInfoHeader->biHeight,&dcMemDC,0,0,SRCCOPY);
    }
    }
    }/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////绘制DIB
    void CSTDIB::DrawEx(CDC *pDC)
    {
    if(m_hBitmap!=NULL)
    {
    DeleteObject(m_hBitmap);
    }
    m_hBitmap = CreateDIBitmap (
    pDC->m_hDC, // CDC句柄
    (LPBITMAPINFOHEADER)m_lpImageData, // 指向图像信息头
    (LONG)CBM_INIT, // 初始化选项
    (LPSTR)m_lpImageData+sizeof(BITMAPINFOHEADER)+m_dwColorsNum*sizeof(RGBQUAD),// 图像数据区
    (LPBITMAPINFO)m_lpImageData, // 指向图像信息
    DIB_RGB_COLORS // 调色板RGB定义
    );
    if(m_hBitmap != NULL)
    {
    CDC dcMemDC;
    dcMemDC.CreateCompatibleDC(pDC);
    SelectObject(dcMemDC.m_hDC, m_hBitmap); 
    pDC->BitBlt(0,0,m_lpBitmapInfoHeader->biWidth,m_lpBitmapInfoHeader->biHeight,&dcMemDC,0,0,SRCCOPY);
    }
    }///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////加载BMP文件
    BOOL CSTDIB::LoadBmpFile(LPCTSTR m_pstrBmpFileName)
    {
      CFile   BmpFile;
      //打开位图文件
      if(BmpFile.Open(m_pstrBmpFileName,CFile::modeRead)==0)
      {
             TRACE("位图文件找不到!");
             return FALSE;
      }
    //创建BITMAPFILEHEADER结构
    m_lpBitmapFileHeader = (LPBITMAPFILEHEADER) new BYTE[sizeof(BITMAPFILEHEADER)];
    if(m_lpBitmapFileHeader == NULL)
    {
    TRACE("创建BITMAPFILEHEADER,内存不足!");
    BmpFile.Close();
    return FALSE;
    }
      //读取BITMAPFILEHEADER:14字节
      if(BmpFile.Read((LPSTR)m_lpBitmapFileHeader,sizeof(BITMAPFILEHEADER))!=sizeof(BITMAPFILEHEADER))
    {
    TRACE("读取BITMAPFILEHEADER失败!");
    BmpFile.Close();
    return FALSE;
    }
    //创建BITMAPINFOHEADER结构
    m_lpBitmapInfoHeader = (LPBITMAPINFOHEADER) new BYTE[sizeof(BITMAPINFOHEADER)];
    if(m_lpBitmapInfoHeader == NULL)
    {
    TRACE("创建LPBITMAPINFOHEADER,内存不足!");
    BmpFile.Close();
    return FALSE;
    }
    //读取BITMAPINFOHEADER:40字节
      if(BmpFile.Read((LPSTR)m_lpBitmapInfoHeader,sizeof(BITMAPINFOHEADER))!=sizeof(BITMAPINFOHEADER))
    {
    TRACE("读取BITMAPINFOHEADER失败!");
    BmpFile.Close();
    return FALSE;
    }
      //4倍化行宽
      DWORD LineBytes = (DWORD)WIDTHBYTES(m_lpBitmapInfoHeader->biWidth*m_lpBitmapInfoHeader->biBitCount);
      //确定位图大小
      m_dwImageSize = (DWORD)(LineBytes*m_lpBitmapInfoHeader->biHeight);
      //确定颜色值
    if(m_lpBitmapInfoHeader->biClrUsed!=0)
      {
      m_dwColorsNum=(DWORD)m_lpBitmapInfoHeader->biClrUsed;
      }
      else
      {
             switch(m_lpBitmapInfoHeader->biBitCount)
      {
             case 1:
      {
                  m_dwColorsNum=2; break;
      }
              case 4:
      {
                  m_dwColorsNum=16; break;
      }
              case 8:
      {
                  m_dwColorsNum=256; break;
      }
              case 24:
      {
                  m_dwColorsNum=0; break;
      }
                 default:
      {
    TRACE("无效的颜色值!");
    BmpFile.Close();
    return FALSE; 
      }
            }
      }
    //确定lpImgData的分配内存
    m_lpImageData = (LPBITMAPINFOHEADER) new BYTE[sizeof(BITMAPINFOHEADER)+m_dwColorsNum*sizeof(RGBQUAD)+m_dwImageSize];
    if(m_lpImageData == NULL)
    {
    TRACE("创建lpImgData的分配内存,内存不足!");
    BmpFile.Close();
    return FALSE;
    }
        //越过BITMAPFILEHEADER
      BmpFile.Seek(sizeof(BITMAPFILEHEADER),CFile::begin);
      //读取BITMAPINFOHEADER+调色板+图像数据
      if(BmpFile.Read((BYTE *) m_lpImageData, sizeof(BITMAPINFOHEADER)+m_dwColorsNum*sizeof(RGBQUAD)+m_dwImageSize)
    !=sizeof(BITMAPINFOHEADER)+m_dwColorsNum*sizeof(RGBQUAD)+m_dwImageSize)
    {
    TRACE("读取BITMAPINFOHEADER+调色板+图像数据失败!");
    BmpFile.Close();
    return FALSE;
    }
      BmpFile.Close(); m_bFileIsLoaded = TRUE;
      return TRUE; 
    }
      

  7.   

    续类的实施文件:
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////根据外部图像数据创建256色(灰度)DIB (宽度可以不是4的倍数)
    BOOL CSTDIB::CreateDib256(BYTE *pImageData, int nWidth, int nHeight)
    {
    ASSERT( pImageData != NULL);
    ASSERT( nWidth > 0 );
    ASSERT( nHeight > 0 );

    WORD biBitCount = 8;
    m_dwColorsNum = 256;
    int nRefinedWidth = WIDTHBYTES(nWidth*biBitCount);
    m_dwImageSize = nRefinedWidth * nHeight ; //创建BITMAPFILEHEADER
    m_lpBitmapFileHeader = (LPBITMAPFILEHEADER) new BYTE[sizeof(BITMAPFILEHEADER)];
    if(m_lpBitmapFileHeader == NULL)
    {
    TRACE("创建BITMAPFILEHEADER失败!");
    return FALSE;
    }
    m_lpBitmapFileHeader->bfType = 0x4D42;//"BM"
    m_lpBitmapFileHeader->bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) 
                                                                 + m_dwColorsNum * sizeof(RGBQUAD) + m_dwImageSize;
    m_lpBitmapFileHeader->bfReserved1 = 0;
    m_lpBitmapFileHeader->bfReserved2 = 0;
    m_lpBitmapFileHeader->bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) 
                                                                                 + m_dwColorsNum * sizeof(RGBQUAD);
    //创建BITMAPINFOHEADER
    m_lpBitmapInfoHeader = (LPBITMAPINFOHEADER) new BYTE[sizeof(BITMAPINFOHEADER)];
    if(m_lpBitmapInfoHeader == NULL)
    {
    TRACE("创建BITMAPINFOHEADER失败!");
    return FALSE;
    }
    m_lpBitmapInfoHeader->biSize = sizeof(BITMAPINFOHEADER);
    m_lpBitmapInfoHeader->biWidth = nRefinedWidth;
    m_lpBitmapInfoHeader->biHeight = nHeight;
    m_lpBitmapInfoHeader->biPlanes = 1;
    m_lpBitmapInfoHeader->biBitCount = biBitCount;
    m_lpBitmapInfoHeader->biCompression = BI_RGB;
    m_lpBitmapInfoHeader->biSizeImage = m_dwImageSize;
    m_lpBitmapInfoHeader->biXPelsPerMeter = 0;
    m_lpBitmapInfoHeader->biYPelsPerMeter = 0;
    m_lpBitmapInfoHeader->biClrUsed = m_dwColorsNum;
    m_lpBitmapInfoHeader->biClrImportant = 0; //确定lpImgData的分配内存
    m_lpImageData = (LPBITMAPINFOHEADER) new BYTE[sizeof(BITMAPINFOHEADER) + m_dwColorsNum * sizeof(RGBQUAD) + m_dwImageSize];
    if(m_lpImageData == NULL)
    {
    TRACE("创建lpImgData内存失败!");
    return FALSE;
    } //赋值BITMAPINFOHEADER
    LPBITMAPINFOHEADER pBi = (LPBITMAPINFOHEADER)((LPSTR)m_lpImageData);
    pBi->biSize = m_lpBitmapInfoHeader->biSize;
    pBi->biWidth = m_lpBitmapInfoHeader->biWidth;
    pBi->biHeight = m_lpBitmapInfoHeader->biHeight;
    pBi->biPlanes = m_lpBitmapInfoHeader->biPlanes;
    pBi->biBitCount = m_lpBitmapInfoHeader->biBitCount;
    pBi->biCompression = m_lpBitmapInfoHeader->biCompression;
    pBi->biSizeImage = m_lpBitmapInfoHeader->biSizeImage;
    pBi->biXPelsPerMeter = m_lpBitmapInfoHeader->biXPelsPerMeter;
    pBi->biYPelsPerMeter = m_lpBitmapInfoHeader->biYPelsPerMeter;
    pBi->biClrUsed = m_lpBitmapInfoHeader->biClrUsed;
    pBi->biClrImportant = m_lpBitmapInfoHeader->biClrImportant;

    //创建调色板
    LPRGBQUAD lpRGB = (LPRGBQUAD)((LPSTR)m_lpImageData+(DWORD)sizeof(BITMAPINFOHEADER));
    for(DWORD i = 0;i<m_dwColorsNum;i++) 
    {
    lpRGB->rgbRed = (BYTE)i;
    lpRGB->rgbGreen = (BYTE)i;
    lpRGB->rgbBlue = (BYTE)i;
    lpRGB->rgbReserved = (BYTE)0;
    lpRGB++;
    }

    //赋值图像数据
    LPBYTE pImgData = (LPBYTE)((LPSTR)m_lpImageData +(DWORD)(sizeof(BITMAPINFOHEADER)+m_dwColorsNum*sizeof(RGBQUAD)));
    for(int j = 0 ; j < nHeight ; j++ )
    {
    for(int k = 0 ; k < nWidth ; k++ )
    {
    pImgData[(nHeight-1-j) * nRefinedWidth + k] = pImageData[j * nWidth + k ];
    }
    }

    m_bFileIsLoaded = TRUE;

    return TRUE;
    }///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////保存位图
    BOOL CSTDIB::SaveAsBmpFile(LPCTSTR pstrBmpName)
    {
      CFile   BmpFile;
      //打开位图文件
      if(BmpFile.Open(pstrBmpName,CFile::modeCreate|CFile::modeWrite)==0)
      {
             TRACE("位图文件找不到!");
             return FALSE;
      }
    BmpFile.Write((LPSTR)m_lpBitmapFileHeader,sizeof(BITMAPFILEHEADER));
    BmpFile.Write((LPSTR)m_lpImageData,sizeof(BITMAPINFOHEADER)+m_dwColorsNum*sizeof(RGBQUAD)+m_dwImageSize); BmpFile.Close(); return TRUE;
    }///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////将灰度数据作为24位真彩色DIB显示 pImageData是nWidth X nHeight 1 bit的数据块
    BOOL CSTDIB::CreateGrayDib24K(BYTE *pImageData, int nWidth, int nHeight)
    {
    ASSERT( pImageData != NULL);
    ASSERT( nWidth > 0 );
    ASSERT( nHeight > 0 ); // 重确定图像宽度为4的倍数
    int nRefinedWidth = ( nWidth + 3 ) /4 * 4 ; m_dwImageSize = ( nRefinedWidth * 3 ) * nHeight ; //创建BITMAPFILEHEADER
    m_lpBitmapFileHeader = (LPBITMAPFILEHEADER) new BYTE[sizeof(BITMAPFILEHEADER)];
    if(m_lpBitmapFileHeader == NULL)
    {
    TRACE("创建BITMAPFILEHEADER失败!");
    return FALSE;
    }
    m_lpBitmapFileHeader->bfType = 0x4D42;//"BM"
    m_lpBitmapFileHeader->bfSize = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+m_dwImageSize;
    m_lpBitmapFileHeader->bfReserved1 = 0;
    m_lpBitmapFileHeader->bfReserved2 = 0;
    m_lpBitmapFileHeader->bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);

    //创建BITMAPINFOHEADER
    m_lpBitmapInfoHeader = (LPBITMAPINFOHEADER) new BYTE[sizeof(BITMAPINFOHEADER)];
    if(m_lpBitmapInfoHeader == NULL)
    {
    TRACE("创建BITMAPINFOHEADER失败!");
    return FALSE;
    }
    m_lpBitmapInfoHeader->biSize = sizeof(BITMAPINFOHEADER);
    m_lpBitmapInfoHeader->biWidth = nRefinedWidth;
    m_lpBitmapInfoHeader->biHeight = nHeight;
    m_lpBitmapInfoHeader->biPlanes = 1;
    m_lpBitmapInfoHeader->biBitCount = 24;
    m_lpBitmapInfoHeader->biCompression = BI_RGB;
    m_lpBitmapInfoHeader->biSizeImage = m_dwImageSize;
    m_lpBitmapInfoHeader->biXPelsPerMeter = 0;
    m_lpBitmapInfoHeader->biYPelsPerMeter = 0;
    m_lpBitmapInfoHeader->biClrUsed = 0;
    m_lpBitmapInfoHeader->biClrImportant = 0;
    //确定lpImgData的分配内存
    m_lpImageData = (LPBITMAPINFOHEADER) new BYTE[sizeof(BITMAPINFOHEADER)+m_dwImageSize];
    if(m_lpImageData == NULL)
    {
    TRACE("创建lpImgData内存失败!");
    return FALSE;
    }
    //赋值BITMAPINFOHEADER
    LPBITMAPINFOHEADER pBi = (LPBITMAPINFOHEADER)((LPSTR)m_lpImageData);
    pBi->biSize = m_lpBitmapInfoHeader->biSize;
    pBi->biWidth = m_lpBitmapInfoHeader->biWidth;
    pBi->biHeight = m_lpBitmapInfoHeader->biHeight;
    pBi->biPlanes = m_lpBitmapInfoHeader->biPlanes;
    pBi->biBitCount = m_lpBitmapInfoHeader->biBitCount;
    pBi->biCompression = m_lpBitmapInfoHeader->biCompression;
    pBi->biSizeImage = m_lpBitmapInfoHeader->biSizeImage;
    pBi->biXPelsPerMeter = m_lpBitmapInfoHeader->biXPelsPerMeter;
    pBi->biYPelsPerMeter = m_lpBitmapInfoHeader->biYPelsPerMeter;
    pBi->biClrUsed = m_lpBitmapInfoHeader->biClrUsed;
    pBi->biClrImportant = m_lpBitmapInfoHeader->biClrImportant;
    //赋值图像数据
    LPBYTE pImgData = (LPBYTE)((LPSTR)m_lpImageData+(DWORD)(sizeof(BITMAPINFOHEADER))); for(int j =0; j<nHeight;j++)
    {
    for(int k=0;k<nWidth;k++)
    {
    pImgData[(nHeight-1-j)*nRefinedWidth*3+k*3+0] = pImageData[j*nWidth+k];
    pImgData[(nHeight-1-j)*nRefinedWidth*3+k*3+1] = pImageData[j*nWidth+k];
    pImgData[(nHeight-1-j)*nRefinedWidth*3+k*3+2] = pImageData[j*nWidth+k];
    }
    } m_bFileIsLoaded = TRUE; return TRUE;
    }
      

  8.   

    实现相同功能,用SDK写绝对要不了这么多代码