连续显示指定路径下的多个BMP图片 RT请高手指点哈~~最好有参考代码~~.cn 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 写个获取Bitmap 文件名的方法可以遍历你存放Bitmap的文件夹然后BOOL LoadBitmap( LPCTSTR lpszResourceName );如果图片不多 直接加载在资源中也可以根据ID显示BOOL LoadBitmap( UINT nIDResource ); 因为图片是不确定的,所以不好用指定资源的方法,Load过后怎么处理啊?楼上的说详细点好吧~~谢谢了,分数不多,不过肯定给的 LoadBitmap是从程序资源中取位图,要从指定取位图可以用CImage类,调用CImage类的Load函数。连续显示可以用SetTimer定时切换。LZ的问题描述不够清楚,所以没没法说得太详细。 我是要从SD卡里读取几张BMP图片,然后循环显示出来~~ 每张图定义一个CImage型变量,用SetTimer定时切换。 楼上的有显示一副BMP图像的代码吗?给我参考下~~ 代码没有。如果你用Picture控件显示,就关联一个CStatic变量,显示时调CStatic类的SetBitmap,参数给CImage类的实例,这样就可以了。 1、BMP格式图片的显示利用句柄进行显示,显示的主要代码如下 HDC hdc; //设备环境句柄HDC hdcmem; //内存设备环境句柄HBITMAP hBm; //位图句柄BITMAP bm; //BITMAP结构以下代码段可以放入WM_CREATE消息中hdc=GetDC(hWnd); //获取设备环境hBm=LoadBitmap(hInst,(LPCWSTR)IDB_BMP_LOGO_MAIN); //加载位图GetObject(hBm,sizeof(BITMAP),(LPVOID)&bm); //获取位图尺寸hdcmem=CreateCompatibleDC(hdc); //获取内存设备环境ReleaseDC(hWnd,hdc); //释放设备环境 以下代码段可以放入WM_PAINT消息中 hdc = BeginPaint(hWnd, &ps);SelectObject(hdcmem, hBm);//调用函数BitBlt将内存设备环境中的位图复制到设备环境中BitBlt(hdc,0,0,bm.bmWidth, bm.bmHeight, hdcmem, 0 , 0 ,SRCCOPY);EndPaint(hWnd, &ps);在网上找到以上代码,可是在EVC下面报错了什么原因啊? 我做过图片浏览器,这里给你代码 参考下// TODO: 在此添加命令处理程序代码 TCHAR szFilter[]=_T("BMP (*.bmp)|*.bmp|All Files (*.*)|*.*||"); CFileDialog dlg(TRUE,_T("*.bmp"),_T("*.bmp"),NULL,szFilter); dlg.m_ofn.Flags |= OFN_FILEMUSTEXIST; dlg.m_ofn.lpstrTitle = _T("读取BMP图片"); //dlg.m_ofn.lpstrFile=_T("陈煜"); if( !dlg.DoModal() ) return ; //清空 m_Path.clear(); //打开要映射的文件到内存 m_strFilePath=dlg.GetPathName();//+dlg.GetFileName(); int nPos=m_strFilePath.ReverseFind(_T('\\'))+1; CString strFile=m_strFilePath.Left(nPos); CString FilePath=strFile+_T("*.bmp"); CFileFind find; BOOL bWork=find.FindFile(FilePath); while(bWork) { //OpenBmp(); bWork=find.FindNextFile(); CString str=find.GetFileName(); str=strFile+str; m_Path.push_back(str); } m_nPos=m_Path.size()-1; OpenBmp();}void CMainWindow::OnBmpNext(){ // TODO: 在此添加命令处理程序代码 if( m_Path.empty() ) { return ; } if( m_nPos--==0 ) { m_nPos=m_Path.size()-1; } m_strFilePath=m_Path.at(m_nPos); OpenBmp();}void CMainWindow::OpenBmp(){ if( m_strFilePath.IsEmpty() ) { return ; } HANDLE hFile=::CreateFile(m_strFilePath,GENERIC_READ,FILE_SHARE_READ,NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); if( hFile==INVALID_HANDLE_VALUE ) { MessageBox(_T("读取文件出错")); return; } //创建内存映射 HANDLE hMap=::CreateFileMapping(hFile,NULL,PAGE_READONLY,NULL,NULL,NULL); //映射整个BMP文件内存,返回首地址 LPVOID lpBase=::MapViewOfFile(hMap,FILE_MAP_READ,0,0,0); //获取BMP信息 BITMAPFILEHEADER *pBmpHeader; BITMAPINFO *pBmpInfo; //取得BmpHeader指针,获得像素 pBmpHeader=(BITMAPFILEHEADER *)lpBase; if( pBmpHeader->bfType!=MAKEWORD('B','M') ) { MessageBox(_T("只能读取BMP图像文件")); ::UnmapViewOfFile(lpBase); ::CloseHandle(hMap); ::CloseHandle(hFile); return; } BYTE *pBits=(BYTE *)lpBase+pBmpHeader->bfOffBits; //取得BmpInfo指针,获得文件大小 pBmpInfo=(BITMAPINFO *)((BYTE *)lpBase+sizeof(BITMAPFILEHEADER)); m_nHeight=pBmpInfo->bmiHeader.biHeight; m_nWidth=pBmpInfo->bmiHeader.biWidth; //显示BMP到内存设备 CClientDC dc(this); //创建兼容DC HBITMAP hBitmap=::CreateCompatibleBitmap(dc,m_nWidth,m_nHeight); ::SelectObject(m_hMemDC,hBitmap); //把图像放到设备中 int nRet=::SetDIBitsToDevice(m_hMemDC,0,0,m_nWidth,m_nHeight,0,0,0, m_nHeight,pBits,pBmpInfo,DIB_RGB_COLORS); InvalidateRect(NULL,TRUE); ::DeleteObject(hBitmap); ::UnmapViewOfFile(lpBase); ::CloseHandle(hMap); ::CloseHandle(hFile); //这册热键 RegisterHotKey(GetSafeHwnd(),WM_MY_HOTKEY,0,VK_F3);} InvalidateRect(NULL,TRUE); 在哪里重绘啊??? 在OnDraw函数里加这些代码怎么显示不出来啊!!!高手指点下~~ CBitmap m_Bitmap; LPCTSTR fileName = L"cc.bmp";// HBITMAP hBitmap=LoadBitmap(NULL,fileName); if (!m_Bitmap.LoadBitmap(fileName)) { return; }// m_Bitmap.Attach (hBitmap); CDC dcImage; if(!dcImage.CreateCompatibleDC (pDC)) return; BITMAP bm; m_Bitmap.GetBitmap (&bm); dcImage.SelectObject (&m_Bitmap); ImageHeight=bm.bmHeight; ImageWidth=bm.bmWidth; // 绘制位图的函数BitBlt pDC->BitBlt (0, 0, ImageHeight, ImageWidth, &dcImage, 0, 0, SRCCOPY); LoadBitmap的意思早跟你解释过了。 可是我上面的代码运行在EVC下面,什么也没有显示,在VC下面却显示正常 转一篇文章:技术总监谈好的程序员如何写代码 UDP是建立请求应答机制 我自绘了一个BUTTON类,为什么点击BUTTON时会出现工具条重绘的现象 vc 初学者求大虾帮忙 打印问题求救:画线 IE控件 webbrowser 的内存占用太大,19M,有什么办法让它小点? 作用域的问题求教 有关多文档界面的菜单设置问题???? 计算器程序中分析带括号算式的算法 谁能给我讲讲Microsoft 的Windows CE,它主要是干什么的,它与MS的其它操作系统有什么特殊的地方? bind总失败,error code: 0 CCombobox覆盖CEdit,为何总是不显示?
可以遍历你存放Bitmap的文件夹
然后
BOOL LoadBitmap( LPCTSTR lpszResourceName );如果图片不多 直接加载在资源中也可以根据ID显示
BOOL LoadBitmap( UINT nIDResource );
Load过后怎么处理啊?
楼上的说详细点好吧~~
谢谢了,分数不多,不过肯定给的
连续显示可以用SetTimer定时切换。
LZ的问题描述不够清楚,所以没没法说得太详细。
给我参考下~~
如果你用Picture控件显示,就关联一个CStatic变量,显示时调CStatic类的SetBitmap,参数给CImage类的实例,这样就可以了。
HDC hdc; //设备环境句柄
HDC hdcmem; //内存设备环境句柄
HBITMAP hBm; //位图句柄
BITMAP bm; //BITMAP结构以下代码段可以放入WM_CREATE消息中
hdc=GetDC(hWnd); //获取设备环境
hBm=LoadBitmap(hInst,(LPCWSTR)IDB_BMP_LOGO_MAIN); //加载位图
GetObject(hBm,sizeof(BITMAP),(LPVOID)&bm); //获取位图尺寸
hdcmem=CreateCompatibleDC(hdc); //获取内存设备环境
ReleaseDC(hWnd,hdc); //释放设备环境 以下代码段可以放入WM_PAINT消息中
hdc = BeginPaint(hWnd, &ps);
SelectObject(hdcmem, hBm);
//调用函数BitBlt将内存设备环境中的位图复制到设备环境中
BitBlt(hdc,0,0,bm.bmWidth, bm.bmHeight, hdcmem, 0 , 0 ,SRCCOPY);
EndPaint(hWnd, &ps);
在网上找到以上代码,可是在EVC下面报错了
什么原因啊?
TCHAR szFilter[]=_T("BMP (*.bmp)|*.bmp|All Files (*.*)|*.*||");
CFileDialog dlg(TRUE,_T("*.bmp"),_T("*.bmp"),NULL,szFilter);
dlg.m_ofn.Flags |= OFN_FILEMUSTEXIST;
dlg.m_ofn.lpstrTitle = _T("读取BMP图片");
//dlg.m_ofn.lpstrFile=_T("陈煜");
if( !dlg.DoModal() )
return ; //清空
m_Path.clear(); //打开要映射的文件到内存
m_strFilePath=dlg.GetPathName();//+dlg.GetFileName(); int nPos=m_strFilePath.ReverseFind(_T('\\'))+1;
CString strFile=m_strFilePath.Left(nPos);
CString FilePath=strFile+_T("*.bmp"); CFileFind find;
BOOL bWork=find.FindFile(FilePath);
while(bWork)
{
//OpenBmp();
bWork=find.FindNextFile();
CString str=find.GetFileName();
str=strFile+str; m_Path.push_back(str);
} m_nPos=m_Path.size()-1; OpenBmp();
}
void CMainWindow::OnBmpNext()
{
// TODO: 在此添加命令处理程序代码
if( m_Path.empty() )
{
return ;
} if( m_nPos--==0 )
{
m_nPos=m_Path.size()-1;
} m_strFilePath=m_Path.at(m_nPos);
OpenBmp();
}
void CMainWindow::OpenBmp()
{
if( m_strFilePath.IsEmpty() )
{
return ;
} HANDLE hFile=::CreateFile(m_strFilePath,GENERIC_READ,FILE_SHARE_READ,NULL,
OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); if( hFile==INVALID_HANDLE_VALUE )
{
MessageBox(_T("读取文件出错"));
return;
} //创建内存映射
HANDLE hMap=::CreateFileMapping(hFile,NULL,PAGE_READONLY,NULL,NULL,NULL); //映射整个BMP文件内存,返回首地址
LPVOID lpBase=::MapViewOfFile(hMap,FILE_MAP_READ,0,0,0);
//获取BMP信息
BITMAPFILEHEADER *pBmpHeader;
BITMAPINFO *pBmpInfo; //取得BmpHeader指针,获得像素
pBmpHeader=(BITMAPFILEHEADER *)lpBase;
if( pBmpHeader->bfType!=MAKEWORD('B','M') )
{
MessageBox(_T("只能读取BMP图像文件")); ::UnmapViewOfFile(lpBase);
::CloseHandle(hMap);
::CloseHandle(hFile); return;
} BYTE *pBits=(BYTE *)lpBase+pBmpHeader->bfOffBits; //取得BmpInfo指针,获得文件大小
pBmpInfo=(BITMAPINFO *)((BYTE *)lpBase+sizeof(BITMAPFILEHEADER));
m_nHeight=pBmpInfo->bmiHeader.biHeight;
m_nWidth=pBmpInfo->bmiHeader.biWidth;
//显示BMP到内存设备
CClientDC dc(this);
//创建兼容DC
HBITMAP hBitmap=::CreateCompatibleBitmap(dc,m_nWidth,m_nHeight);
::SelectObject(m_hMemDC,hBitmap); //把图像放到设备中
int nRet=::SetDIBitsToDevice(m_hMemDC,0,0,m_nWidth,m_nHeight,0,0,0,
m_nHeight,pBits,pBmpInfo,DIB_RGB_COLORS); InvalidateRect(NULL,TRUE); ::DeleteObject(hBitmap);
::UnmapViewOfFile(lpBase);
::CloseHandle(hMap);
::CloseHandle(hFile); //这册热键
RegisterHotKey(GetSafeHwnd(),WM_MY_HOTKEY,0,VK_F3);
}
在哪里重绘啊???
高手指点下~~
CBitmap m_Bitmap;
LPCTSTR fileName = L"cc.bmp";
// HBITMAP hBitmap=LoadBitmap(NULL,fileName);
if (!m_Bitmap.LoadBitmap(fileName))
{
return;
}
// m_Bitmap.Attach (hBitmap);
CDC dcImage;
if(!dcImage.CreateCompatibleDC (pDC))
return;
BITMAP bm;
m_Bitmap.GetBitmap (&bm);
dcImage.SelectObject (&m_Bitmap);
ImageHeight=bm.bmHeight;
ImageWidth=bm.bmWidth; // 绘制位图的函数BitBlt
pDC->BitBlt (0, 0, ImageHeight, ImageWidth, &dcImage, 0, 0, SRCCOPY);