MFC picture控件显示动态/静态BMP图片

该博客旨在分享 IT 技术心得和实际工作中遇到问题的解决方法,以下是新浪博客地址 http://blog.sina.com.cn/qianyumolu ,则为分享经济、行业趋势、心灵文章等,有兴趣的朋友可以踩踩,讨论分享

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------



所谓的静态有两种,一种是在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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值