分享

关于MFC的Picture控件

 chensirDSP 2010-04-23

关于MFC的Picture控件

(2009-10-21 22:12:33)
标签:

杂谈

分类:咖啡豆的技术贴
2009-10-04

    前几天的一个项目,需要在对话框上显示一张图片,所以首先想到使用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);
    }

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多