CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

cstatic 如何能 显示指定的图片文件

楼主xjb2001(便衣超人)2006-04-05 11:39:21 在 VC/MFC / 基础类 提问

cbitmap   只能读取资源  
   
  而   cstatic   只能   setbitmap   ,弄的我不知道怎么从文件中读取图片来显示了  
   
   
  请赐教 问题点数:20、回复次数:18Top

1 楼ydfivy(我就是一送外卖的)回复于 2006-04-05 11:41:33 得分 0

LoadBitmapTop

2 楼xjb2001(便衣超人)回复于 2006-04-05 11:46:11 得分 0

SetEnhMetaFile     可以好像可以实现增强位元图形显示   ,可是   HENHMETAFILE   不知道是什么  
   
  找不到定义的地方,不知道怎么用Top

3 楼xjb2001(便衣超人)回复于 2006-04-05 11:47:39 得分 0

LoadBitmap     只能从资源中读取,我要从文件中读取Top

4 楼xjb2001(便衣超人)回复于 2006-04-05 11:53:09 得分 0

LoadCursorFromFile     这种函数都有  
   
  NND    
   
  怎么就   LoadBitmapFromFile   靠,郁闷死了Top

5 楼wangk(倒之)回复于 2006-04-05 11:57:17 得分 0

用GDI+中有从文件读取的函数Bitmap::FromFileTop

6 楼palmax(用上VS2005了)回复于 2006-04-05 12:01:53 得分 0

网上搜一下CPictureTop

7 楼tufaqing()回复于 2006-04-05 12:03:36 得分 20

CFile   file(   _T("D:\\Bitmap\\11_24.bmp"),   CFile::modeRead   );  
  BITMAPFILEHEADER   bmfh;  
  BITMAPINFOHEADER   bmih;  
  file.Read(   &bmfh,   sizeof(bmfh)   );  
  file.Read(   &bmih,   sizeof(bmih)   );  
  int   nWidth   =   bmih.biWidth;  
  int   nHeight   =   bmih.biHeight;  
  int   nPixelBits   =   bmih.biBitCount;  
  DWORD   nSize   =   bmih.biSizeImage;  
  BYTE   *lpBits   =   new   BYTE[nSize];  
  file.Read(   lpBits,   nSize   );  
   
  CBitmap   bitmap;  
  CDC   dcTemp;  
  dcTemp.CreateCompatibleDC(   pDC   );  
  HBITMAP   hbm   =   CreateDIBitmap(   pDC->GetSafeHdc(),   &bmih,   CBM_INIT,   lpTemp,   (LPBITMAPINFO)&bmih,   DIB_RGB_COLORS   );  
  bitmap.Attach(hbm);  
  dcTemp.SelectObject(   &bitmap   );  
  pDC->BitBlt(   0,   0,   nWidth,   nHeight,   &dcTemp,   0,   0,   SRCCOPY   );Top

8 楼tufaqing()回复于 2006-04-05 12:34:56 得分 0

写错了lpTemp为lpBits,最后没有回收内存和关闭文件,你自己写吧。Top

9 楼xjb2001(便衣超人)回复于 2006-04-05 13:54:52 得分 0

多谢多谢,研究一下,一会回来Top

10 楼xjb2001(便衣超人)回复于 2006-04-05 14:26:07 得分 0

TRY  
        {  
  CFile   file(   _T("c:\\edu_look.bmp"),   CFile::modeRead   );  
  BITMAPFILEHEADER   bmfh;  
  BITMAPINFOHEADER   bmih;  
  file.Read(   &bmfh,   sizeof(bmfh)   );  
  file.Read(   &bmih,   sizeof(bmih)   );  
  int   nWidth   =   bmih.biWidth;  
  int   nHeight   =   bmih.biHeight;  
  int   nPixelBits   =   bmih.biBitCount;  
  DWORD   nSize   =   bmih.biSizeImage;  
  BYTE   *lpBits   =   new   BYTE[nSize];  
  file.Read(   lpBits,   nSize   );  
   
  CBitmap   bitmap;  
  CDC   pDC;  
  CDC   dcTemp;  
  dcTemp.CreateCompatibleDC(   &pDC   );  
  HBITMAP   hbm   =   CreateDIBitmap(   pDC.GetSafeHdc(),   &bmih,   CBM_INIT,   lpBits,   (LPBITMAPINFO)&bmih,   DIB_RGB_COLORS   );  
  bitmap.Attach(hbm);  
  dcTemp.SelectObject(   &bitmap   );  
  pDC.BitBlt(   0,   0,   nWidth,   nHeight,   &dcTemp,   0,   0,   SRCCOPY   );  
   
  m_logo.   SetBitmap(hbm);  
   
  delete   lpBits;  
  dcTemp.DeleteDC();  
  file.Close();  
  }  
  CATCH(   CFileException,   e   )  
  {  
        return   ;  
  }  
  END_CATCH  
   
   
  这段代码看的有点晕,而且   关于   pDC   这个变量的作用没看懂  
   
  程序执行到   pDC.BitBlt   处就非法指针错误了;Top

11 楼xjb2001(便衣超人)回复于 2006-04-05 14:38:40 得分 0

TRY  
        {  
  CFile   file(   _T("c:\\edu_look.bmp"),   CFile::modeRead   );  
  BITMAPFILEHEADER   bmfh;  
  BITMAPINFOHEADER   bmih;  
  file.Read(   &bmfh,   sizeof(bmfh)   );  
  file.Read(   &bmih,   sizeof(bmih)   );  
  int   nWidth   =   bmih.biWidth;  
  int   nHeight   =   bmih.biHeight;  
  int   nPixelBits   =   bmih.biBitCount;  
  DWORD   nSize   =   bmih.biSizeImage;  
  BYTE   *lpBits   =   new   BYTE[nSize];  
  file.Read(   lpBits,   nSize   );  
   
  CBitmap   bitmap;  
  CDC   pDC;  
  CDC   dcTemp;  
   
  pDC.CreateCompatibleDC(NULL);  
  dcTemp.CreateCompatibleDC(   &pDC   );  
  HBITMAP   hbm   =   CreateDIBitmap(   pDC.GetSafeHdc(),   &bmih,   CBM_INIT,   lpBits,   (LPBITMAPINFO)&bmih,   DIB_RGB_COLORS   );  
  bitmap.Attach(hbm);  
  dcTemp.SelectObject(   &bitmap   );  
  pDC.BitBlt(   0,   0,   nWidth,   nHeight,   &dcTemp,   0,   0,   SRCCOPY   );  
   
  m_logo.   SetBitmap(hbm);  
   
  delete   lpBits;  
  dcTemp.DeleteDC();  
  pDC.DeleteDC();  
  file.Close();  
  }  
  CATCH(   CFileException,   e   )  
  {  
        return   ;  
  }  
  END_CATCH  
   
  现在代码是不报错了,可是   cstatic   中,还是没有东西Top

12 楼tufaqing()回复于 2006-04-06 10:34:06 得分 0

哦,原来你不是要Bitblt,而要SetBitmap,那就在OnInitDialog()这样写(测试已通过):  
   
  CFile   file(   _T("D:\\Bitmap\\1.bmp"),   CFile::modeRead   );  
  BITMAPFILEHEADER   bmfh;  
  BITMAPINFOHEADER   bmih;  
  file.Read(   &bmfh,   sizeof(bmfh)   );  
  file.Read(   &bmih,   sizeof(bmih)   );  
  int   nWidth   =   bmih.biWidth;  
  int   nHeight   =   bmih.biHeight;  
  int   nPixelBits   =   bmih.biBitCount;  
  DWORD   nSize   =   bmih.biSizeImage;  
  BYTE   *lpBits   =   new   BYTE[nSize];  
  file.Read(   lpBits,   nSize   );  
   
  CDC   *pDC   =   GetDlgItem(IDC_STATIC1)->GetDC();   //   不要用默认的IDC_STATIC,换个ID  
  HBITMAP   hbm   =   CreateDIBitmap(   pDC->GetSafeHdc(),   &bmih,   CBM_INIT,   lpBits,   (LPBITMAPINFO)&bmih,   DIB_RGB_COLORS   );  
   
  //   要修改属性才能显示  
  m_static1.ModifyStyle(   0xffffffffL,   WS_CHILD|WS_VISIBLE|SS_BITMAP|SS_CENTERIMAGE   );  
  m_static1.SetBitmap(hbm);  
   
  delete[]   lpBits;  
  pDC->DeleteDC();  
  file.Close();  
  Top

13 楼bingsiu(天之云)回复于 2006-04-06 11:21:26 得分 0

tufaqing,你的代码在读取bmp图像时最好加个判断,看是什么类型的bmp图像。现在你的代码只能读取24位真彩色的bmp图像,读取其它类型的就会出错。Top

14 楼tufaqing()回复于 2006-04-06 11:42:59 得分 0

to   bingsiu(天之云)   :  
  哥们儿,你试过吗,没有实践就不要乱说,CreateDIBitmap是创建与设备无关的位图,适用于所有bmp位图,我已经测试过,我的程序对于16、24、32位位图(16位没有调色板的)都能显示,对于有调色板的低于16位的位图,file读写有改改,要把调色板的信息读出来,CreateDIBitmap的一些相应的参数也要改改,DIB_RGB_COLORS换成DIB_PAL_COLORS。Top

15 楼bingsiu(天之云)回复于 2006-04-06 11:46:09 得分 0

呵呵,你自己不也承认对带调色板的位图失效了。Top

16 楼bingsiu(天之云)回复于 2006-04-06 11:50:48 得分 0

我说只适用于24位是图省事。但是像你这样不加判断直接就把信息头后面的数据全都读取算作位图数据也太。。。(呵呵,好歹得加个注释说明一下吧)Top

17 楼xjb2001(便衣超人)回复于 2006-04-19 18:27:17 得分 0

哪里需要那么负责,看好了  
   
        CBitmap   m_Bitmap;  
   
        m_Bitmap.m_hObject   =   LoadImage(NULL,path,IMAGE_BITMAP,0,   0,LR_LOADFROMFILE);    
   
        if   (m_Bitmap.m_hObject!=NULL)  
                m_logo.SetBitmap((HBITMAP)m_Bitmap.Detach());  
   
  唉,放分了Top

18 楼gxxx2000(就要50岁了)回复于 2006-09-06 01:01:49 得分 0

这个我需要,做个记号Top

相关问题

关键词

得分解答快速导航

  • 帖主:xjb2001
  • tufaqing

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo