连续播放一系列图片
可能由于使用了计时器SetTimer
导致图片上出现横向带状闪动(不是全屏闪动)怎样解决这个计时器刷屏太快呢?
在线等
谢谢
可能由于使用了计时器SetTimer
导致图片上出现横向带状闪动(不是全屏闪动)怎样解决这个计时器刷屏太快呢?
在线等
谢谢
解决方案 »
- 已用上了vs2010,如何使基于mfc对话框的程序变得美观?
- 关于Button消息响应的问题
- 各位大牛们,请指点迷津!拜托了!多谢了!
- 一个关于SetCheck()的问题
- 用向导建立的工程,如何不让工具栏随程序启动后自动的加载。就是有保存打开图标的那个。在那里设置???
- 各位大哥,如何做一个VC的DDE,让其他程序共享数据
- C中的T型元素?
- 写多线程的时候,编译通过了,但运行的时候有如下提示怎么办?
- VC6如何生成类似DELPHI里的MEMO控件
- 如何在CRichEdit中实现不带下划线的超链接
- 讨论面试题:实际编程中,类的继承最好控制在几层?为什么?
- 在线等帮我看看下面代码那些错误地方的应该怎么改呀?在线等
不要每次ONTIMER都重绘
还有就是要重载onerasebkgnd方法
另外就是timer只能精确到15ms左右
这里我画图的过程是使用了别人的一个类 先是用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)/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// 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;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////根据外部图像数据创建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;
}