想要实现一个从设备上读取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);
}