一种在MFC程序上显示jpeg图片的方法(一)宁滥勿缺

   鸣谢:https://blog.csdn.net/guo_lei_lamant/article/details/79484818?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

   感谢上面的博主,让我知道了除了臭大街的CBitmap居然还有CImage

   同时鸣谢:https://www.cnblogs.com/DOMLX/p/9598974.html,这位博主让我学习了设备上下文如何准确的获取窗口上任意坐标位置上的一片矩形区域,并把图片流画上去,这位一看就是高手,估计是写军事间谍卫星图片处理软件的,开个玩笑

  学了visual C++蓦然发现,原来根本不放在眼里的“windows拖控件编程”背后是怎样一种令人震惊的复杂:就连鼠标定位,图片的加载也成了一项登月工程!,写下这篇文章的目的源自一个伟大的想法:我想在MFC对话框上插入一张美丽的jpeg图片,让编程和程序界面更富有诗意。结果却是:主流编程书籍,这个宝典,那个入门到精通都闭口不谈实现方式。更让人哭笑不得的是,他们却不厌其烦的谈论在按钮上加载bmp图片。我想他们一定有把饭菜盛在枕头上吃的雅好,要不怎么能想出这么惊悚的主意呢。

    纵观现在主流vc书籍,用vs2010及以后的书也就占了3-4成,而这也是这几年来最好的情况了。MFC编程一开始,给人一种要把windows API进行到底的感觉,然而不久你会发现,为了开发效率----大家都怂了,MFC还是允许自定义对话框的嘛,那还不如直接windows form算了。但是为了体现MFC的伟大之处,还是应该弄的难一点,比如picture control控件休想加载jpeg便是一例。穷其篇幅,还是得感谢上帝提供了IPicture这样一个图像接口,配合IStream在堆区中开辟一片空间,把图片文件生成流的形式渲染到窗口设备上去。

    你以为这就万事大吉了?不挖坑怎么能体现windows的深邃呢,于是大多数书籍,都装孙子般的教你把整张图片渲染到整个MFC窗口客户区去-----这再次暴露了他们喜欢把内裤边提到外套胸口处的爱好,当然了,你想把图片渲染到窗口的某个坐标位置上的矩形区域也不是不可以,那就先声明个CRect的区域吧,然后获取对话框上显示图片的控件picture control 的·ID  IDC_STATIC通过GetDlgItem函数把控件区域对应到CRect类的指针(这里的类指针更像是个传出参数,这个函数把picture control的坐标赋值给了CRect类指针)

GetDlgItem(IDC_STATIC)->GetDC()的作用是生成一个画布,其作用类似声明一个CDC类的指针pdc然后把得到的图片渲染到画布pdc->m_hDC,后面的4个参数依次是相对于对话框左边,顶端的距离
以及目标区域的宽高
    CImage image;
    image.Load(_T("E:\b82e84b7g.jpg"));

    //获取图片客户区位置
    CRect zcRect; 
    GetDlgItem(IDC_STATIC)->GetClientRect(&zcRect); 
   
// 将图像显示在界面之上 
    image.Draw(GetDlgItem(IDC_STATIC)->GetDC()->m_hDC, 
                            zcRect.left, 
                            zcRect.top, 
                            zcRect.Width(), 
                            zcRect.Height());
    }

上述代码的优点在于,可以快速(代码量少)且体面的为我们在对话框上插一个图。不足之处在于,尽管你加载的是jpeg图片,但生成的是一个bmp图片,失真严重,但毕竟在

设备上下文区域获取的方法方面为我们提供了宝贵的参考,而且很容易的实现了图片以适应的模式显示在控件中。

效果:

但起码还算是实现了在指定位置显示

 且看下回分解:你今天在申请的堆空间中,为加载的IPicture生成IStream了吗

原文地址:https://www.cnblogs.com/saintdingspage/p/12424467.html