这两天在做一个图像压缩处理程序的界面,其中用到了动态加载位图。之前只做过静态位图的加载,做动态位图加载也花了点时间。下面我就把静态和动态加载的方法都跟大家分享一下,同时也便于自己查阅,如果大家有更好的办法也记得共享一下哦!
静态加载位图:
1.添加控件:添加Text控件做为显示位图的控件,添加“显示位图”按钮控件;
2.插入位图资源,设置ID为IDB_BITMAP1;
3.用classwizard为按钮控件添加响应函数,并添加代码如下:
void CStaticImageDlg::OnShowbitmap()
{
// TODO: Add your control notification handler code here
//获得指向静态控件的指针
CStatic *pStatic=(CStatic *)GetDlgItem(IDC_STATICIMAGE2);
//获得位图句柄
HBITMAP hBitmap=::LoadBitmap(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(IDB_BITMAP1));
//设置静态控件的样式,使其可以使用位图,并试位标显示使居中
pStatic->ModifyStyle(0xF,SS_BITMAP|SS_CENTERIMAGE);
//设置静态控件显示位图
pStatic->SetBitmap(hBitmap);
}
然后就可以编译运行了。
动态加载位图
动态加载位图也就是说可以通过点击按钮来选择文件中你所想要打开显示的位图,而不是事先导入的。
1.首先也是添加显示位图的控件,不过这次添加的是picture控件,然后添加“显示位图”按钮;
2.为“显示位图”按钮添加响应函数:
void CLoadMapDlg::OnLoadmap()
{
// TODO: Add your control notification handler code here
OnPaint();
CString m_strfile;
CRect r;
GetClientRect(&r); //获得控件客户窗口大小
CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
"Bmp files(*.bmp)|*.bmp|",NULL);
if(dlg.DoModal ())
{
m_strfile=dlg.GetPathName ();
}
HBITMAP hbitmap=(HBITMAP)LoadImage(AfxGetInstanceHandle(),m_strfile,IMAGE_BITMAP,r.Width()/2,
r.Height()/2,LR_LOADFROMFILE);
CStatic* pPic=(CStatic*)GetDlgItem(IDC_PICTURE);
ASSERT(pPic);
pPic->SetBitmap(hbitmap);
Invalidate();
}
3.最重要的一点是插入的picture控件的TYPE要选中“BitMap”,而不是Frame,否则将出现编译通过,而位图无法显示的情况!
在解决静态和动态加载图片的过程中我更加体会到做事情多思考,多动手,多像GOOGLE请教的道理。以前我总是照着书上的例子敲代码,结果发现真正要做出一个东西的时候,却一行代码都写不出来。那时候才后悔当初练习的时候为什么不看懂才敲。俺要做的是程序员不是打字员。虽然我们必须从书本上的范例开始学习,但是在每学完一个例子以后我们应该把从中学到的东西结合自己以前学的东西来做出一个属于自己的东西来,这样我们才真正进步了哦!