MFC的picture控件静态动态加载位图

所谓的静态有两种,一种是在picture属性中直接加载(type选择bitmap,image选择已加载到资源中的位图),另一种是通过编程加载,这两种的前提都要我们先把位图导入到资源中去,下面说下后一种。

001:新建对话框工程,加入picture控件,关联变量为m_Bmp(类型为control),ID也要改一下,因为采用默认的,有重名,在关联变量的时候找不到picture项,再拖一个按钮上去,我们要实现的结果是,单击一下按钮,就会显示出位图

002:双击按钮,在消息处理函数中添加

HBITMAP hBitmap;
hBitmap = ::LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP1));
m_Bmp.SetBitmap(hBitmap);                 /***IDB_BITMAP1是你载入资源中位图的ID号***/

003:此时运行的话,图片却没有出来,这是因为你还没有把picture控件中的type设置为bitmap类型,设置一下,一切ok!简简单单!

下面说下动态载入,动态载入就是不用事先把位图导入资源,直接在程序运行的时候,弹出一个文件选择对话框,选择你想要显示的对话框即可。此列中依旧要把picture控件中的type设置为bitmap类型,否则会出现图片显示不出来的问题。

和以上静态显示唯一的区别只体现在按钮的消息处理函数中,此列中的消息处理函数内容为

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);   
m_Bmp.SetBitmap(hbitmap);

好了,动态显示也做出来了。

忘记告诉大家,加载文件的时候,路径一定要是英文的!!!

转自:

http://student.csdn.net/space.php?uid=210723&do=blog&id=19022

前几天的一个项目,需要在对话框上显示一张图片,所以首先想到使用Picture控件来显示。但是这个东西以前没有用过,又懒得查帮助,所以就纯粹把它当作显示的Canvas,把它的DC取出来,把图就给刷上去了。呵呵,说到底并没有真正使用这个控件。不过即使这样,图像还是可以显示,成功蒙混过关。
后来总觉得心里不踏实,于是总结了一下,发现这种做法确实不好。首先是这样做的话,图像边界问题常常要自己考虑,否则一不小心,就把图刷出界了。原先倒是有写过一个视频捕捉的程序,由于视频流的每一帧是固定大小的,所以当时更加偷懒,呵呵,直接搞一个裸奔的对话框,然后把图像直接满屏刷到对话框的DC中。这次之所以第一感觉就看上Picture控件,是期望它能帮我完成裁剪的功能。毕竟这次需要显示的图像的尺寸差异甚大,所以我希望固定图片的显示区域,超出部分就自动裁剪了多好。可惜没有那么便宜的事情,光取一个DC就刷图,MFC居然是不分青红皂白直接往上刷,管它边界在哪里,所以Picture控件边上一些可怜的Static控件努力透出Picture的DC来显示,整个界面实在看不下去。不得已,最后只好老老实实自己缩放图片,死活把全图刷到Picture控件的Rect中,坚决打击了越界现象;后来又发现了这样做的另外一个坏处,就是刷新不及时。每次移动窗口时,MFC就是不主动去刷Picture的图,此时会出现Picture控件中一部分是图,一部分是别的桌面元素的现象,实在怪异。当下颇为怀念Doc/View结构,那玩意儿刷图到View里实在省事多了。
今天终于痛下决心真正用一下Picture控件,所以稍稍研究了一下,发现其实用起来也不难。总结一下步骤:
1. 首先Picture控件的Type选Bitmap,没查MSDN,不知道这种和别的Type有何区别,但是至少这个是能用的(名字最符合要求嘛);
2. 用一个CStatic类型的控件变量去关联到这个控件上,例如叫m_picture;
3. 在需要改变图片的地方,先从图片生成一个HBITMAP,例如叫m_bitmap,然后只要m_picture.SetBitmap(m_bitmap)就可以了。这样做的好处很明显了,越界问题和刷新问题都解决了;如果对Picture的自动裁剪功能不爽,可以自己缩放图片后再生成m_bitmap。我是用CxImage加载图片的,因此显示图片的这段代码就是:
CxImage image;
image.Load("welcome.jpg", CXIMAGE_FORMAT_JPG);
if (image.IsValid())
{
if (m_bitmap) DeleteObject(m_bitmap);
image.Resample(m_rect.Width(), m_rect.Height()); //按照Picture控件的大小,(不按比例)缩放原始图片
m_bitmap = image.MakeBitmap(m_picture.GetDC()->m_hDC);
HBITMAP OldBitmap = m_picture.SetBitmap(m_bitmap);
if (OldBitmap) DeleteObject(OldBitmap);
}

转自:http://blog.sina.com.cn/s/blog_561c033c0100fm3q.html

posted @ 2012-03-31 15:59 一个农夫 阅读(...) 评论(...) 编辑 收藏