现在的位置: 首页 > 综合 > 正文

eVC编程遇到的各种问题之——bmp文件

2012年09月22日 ⁄ 综合 ⁄ 共 1089字 ⁄ 字号 评论关闭

想要实现一个从设备上读取bmp图片,再显示在对话框里的功能。本来挺简单的,可是却出现了各种问题……

查看前人的编写代码发现,大部分用了LoadImage,但是并没有把文件读取进来。调试发现h_bmp句柄是NULL,就是说出了错误。GetLastError()发现错误返回值是1814,The specified resource name cannot be found in the image file。后来发现其实LoadImage是vc中的方法,而evc是要用SHLoadDIBitmap的……

   

 

总结:

实现bmp文件读取显示的方式有3个类型

1、bmp图片作为资源(resouce)的一部分,就是添加到evc的ResouceView中的,有资源ID的bitmap。对于这种bmp图片的读取(属于静态读取),可以用

HBITMAP h_bmp; 

h_bmp= LoadBitmap(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDB_BITMAP1));

这种方法。

2、bmp图片是存储在设备上的,随机载入的(动态读取),我也是在这弄了很久。网上看大家大部分是用LoadImage函数的,但是是了很久,还是无法读取。后来看到有个说法说evc是要用SHLoadDIBitmap的,试了下,成功~~

 

3、对于前两种方式,只是实现读取和显示,并未对图像本身进行处理。如果要对图像本身处理,需要对bmp文件内容进行读取和修改。这部分涉及到文件结构等等,就比较麻烦了。

最终实现代码如下:

 CFileDialog filedlg(TRUE);
 filedlg.m_ofn.lpstrTitle = _T("地形图读取");
 filedlg.m_ofn.lpstrFilter = _T("BMP Files(*.bmp)/0*.bmp/0/0");

 if(IDOK==filedlg.DoModal())
 {
     m_strFile=filedlg.GetPathName();

     HBITMAP h_bmp;  
     HINSTANCE hInstance = AfxGetInstanceHandle();

     h_bmp= SHLoadDIBitmap(m_strFile);    
     if(h_bmp==NULL)
     {
          error = GetLastError();
     }

     pWinShow->ModifyStyle(0xF,SS_BITMAP|SS_CENTERIMAGE);
     pWinShow->SetBitmap(h_bmp);

}

抱歉!评论已关闭.