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

来源:互联网 发布:php自动加载类意义 编辑:程序博客网 时间:2024/05/22 01:26

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; 
}