VC8.0中的一些心得体会——打开位图

本文介绍了一个使用C++实现的位图(BMP)文件加载过程。通过创建对话框选择位图文件并验证其有效性,然后读取位图文件头及信息头,并将位图数据读入内存。该过程涉及文件操作、位图格式识别与内存分配。

void CTRYDoc::OnFileOpen()
{
 // TODO: 在此添加命令处理程序代码
   CString   str    =   _T("BMP");
   CString   str1   =   _T("Image files (*.BMP)|*.BMP||");
   CString   str2   =   _T("位图打开");
   CString   str3   =   _T("取消读入位图");
   CString   str4   =   _T("读入位图失败");
   CString   str5   =   _T("不是位图格式文件");


   LPCWSTR   sext   =   (LPCWSTR)str;
   LPCWSTR   sfiltr =   (LPCWSTR)str1;
   LPCWSTR   sz     =   (LPCWSTR)str2;
   LPCWSTR   sz1    =   (LPCWSTR)str3;
   LPCWSTR   sz2    =   (LPCWSTR)str4;
   LPCWSTR   sz3    =   (LPCWSTR)str5;

 

 CFileDialog Open(TRUE,sext,
    NULL, OFN_HIDEREADONLY,
    sfiltr);
 Open.m_ofn.lpstrTitle=sz; 
 int ret=Open.DoModal();
 CString bmpPath;
 if(ret==IDOK)
  bmpPath=Open.GetPathName( );
 else
 {
  AfxMessageBox(sz1);
  //return TRUE;
 }
 CFile file;   
 if(!file.Open(bmpPath,CFile::modeRead|CFile::shareDenyWrite))
 {
  AfxMessageBox(sz2);
  //return FALSE;
 }
 BITMAPFILEHEADER *lpbmpfilehead=(BITMAPFILEHEADER*)(new char[14]);//1  
 DWORD size;  
 size=file.GetLength();
 file.Read(LPSTR(lpbmpfilehead),14); 
 if(lpbmpfilehead->bfType!=0x4d42)
 {
  AfxMessageBox(sz3);
  //return TRUE;
 }
 BITMAPINFOHEADER *lpbmpinfohead=(BITMAPINFOHEADER*)(new char[40]);//2
    bmpfilesize=lpbmpfilehead->bfSize-lpbmpfilehead->bfOffBits;//象素所占空间
 UpdateMemSize(bmpfilesize+40+256*4); 
 file.Read(LPSTR(lpbmpinfohead),40);    
 CopyMemory(lpDIB,lpbmpinfohead,40); 
 //lpbmpinfohead可以用来对位图的信息作初步的判断
 delete []lpbmpfilehead;//1
    delete []lpbmpinfohead;//2
 file.Read(lpDIB+40,size-54);
 file.Close();
 drawbmp=TRUE;//唯一用来确定载入哪种格式位图,bmp or Jpeg or other?
 LoadBmp=TRUE;//view类中位图内存区域只是在doc类打开open菜单时才从doc类读入数据
 UpdateAllViews(NULL);
 LoadBmp=FALSE;
// return TRUE; 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值