前段时间做大一专业实训,用MFC做一个图片查看类程序,对于从来没有学过C++的我们来说显示一张图片就是一件很难的事情了,作为小组里唯一一个MFC设计者,我从网上有很多关于MFC图片控件显示的文章,但大多数文章描述的方法不能满足我们的需求。我们需要显示一个文件夹中任意一张图片,实现前后翻页,按比例显示,并且实现图片旋转。现在介绍如何在picture control中按比例显示一张任意格式的图片。

showpic();函数的实现

分为四个步骤
1.用image类创建一个图片对象,获取其宽和高;
2.获取控件句柄,从而获得控件客户区的相关参数;
3.计算,算出图片应该按怎样的比例显示出来;
4.获取控件的DC,将图片显示出来;

   下面先上代码,附部分注释

代码块

void ShowPic()//形参可以为所给的图片对象的指针,这里为了通用性省去了形参
{float cx, cy, dx, dy, k, t;//跟控件的宽和高以及图片宽和高有关的参数CRect   rect;//用于获取图片控件的宽和高CImage q;//为cimage图片类创建一个对象q.Load("你想加载的图片路径");//构造函数的形参是所加载图片的路径 cx = q.GetWidth();cy = q.GetHeight();//获取图片的宽 高k = cy / cx;//获得图片的宽高比CWnd *pWnd = NULL;pWnd = GetDlgItem(你定义的图片控件的ID);//获取控件句柄pWnd->GetClientRect(&rect);//获取Picture Control控件的客户区dx = rect.Width();dy = rect.Height();//获得控件的宽高比t = dy / dx;//获得控件的宽高比if (k >= t){rect.right = floor(rect.bottom / k);rect.left = (dx - rect.right) / 2;rect.right = floor(rect.bottom / k) + (dx - rect.right) / 2;}else{rect.bottom = floor(k*rect.right);rect.top = (dy - rect.bottom) / 2;rect.bottom = floor(k*rect.right) + (dy - rect.bottom) / 2;}//相关的计算为了让图片在绘图区居中按比例显示,原理很好懂,如果图片很宽但是不高,就上下留有空白区;如果图片很高而不宽就左右留有空白区,并且保持两边空白区一样大CDC *pDc = NULL;pDc = pWnd->GetDC();//获取picture control的DC,这是什么玩意我也不知道,百度就行int ModeOld = SetStretchBltMode(pDc->m_hDC, STRETCH_HALFTONE);//设置指定设备环境中的位图拉伸模式GetDlgItem(Pic)->ShowWindow(FALSE);GetDlgItem(Pic)->ShowWindow(TRUE);q.StretchBlt(pDc->m_hDC, rect, SRCCOPY);//显示函数SetStretchBltMode(pDc->m_hDC, ModeOld);ReleaseDC(pDc);//释放指针空间
}

运行效果



总结

编译环境 VS2017
作者现在大二在读,水平有限,之前学过C语言,从零开始学C++到项目结题共用时10天,代码鄙陋,留给自己以后查找用。

C++ MFC picture control控件按比例显示任意图片文件(jpg、bmp等)相关推荐

  1. 【MFC】动态加载Picture Control控件中的图片

    [MFC]动态加载Picture Control控件中的图片 前言 方法1:CBrush 方法2:SetBitmap 参考链接 方法3:重写MyPictureControl 前言 在MFC窗体中,我们 ...

  2. MFC 对话框中的picture control 控件显示图片

    MFC读取图片一般使用自定义的DIB文件.DIB文件集中了处理图片的API函数,这样可以方便我们的图像操作. DIB文件下载路径:DIB文件下载 MFC显示图片有几种方法: 1.在运行界面上选择 文件 ...

  3. MFC怎么让图片适应picture control控件的大小

    最近做项目时,遇到一个问题,想要让picture control中的图片显示与该控件的大小一致,用的环境是vs2008,添加一个控件后,更改其type为bitmap,此时的控件大小不能改变,需要将Ce ...

  4. MFC List Control 控件添加单元格编辑,实现可编辑重写

    在实现随机生成四则运算的个人项目中,目前已经完成基本功能,想要把程序变成一个Windows界面的程序.原本以为学习过MFC,应该很快就能完成.但是由于以前用的都是VC6.0,这次用了VS2010,稍微 ...

  5. VS 2019 MFC Edit Control控件自绘带软键盘

    实现功能:点击Edit控件后弹出软键盘,并能设置软键盘的输入最大者和最小值,软键盘采用非模态对话框创建,软键盘按钮字体颜色.背景颜色可以改变.Edit控件获得焦点和失去焦点后字体颜色和背景颜色动态可变 ...

  6. Picture Control 控件 加载图片 画线

    编程中遇到问题,如何在已有图片上添加 虚线,图片使用Picture控件显示 参考网页https://bbs.csdn.net/topics/10044979 其中参考程序段如下: 这是我画线的程序: ...

  7. MFC入门(三)-- MFC图片/文字控件(循环显示文字和图片的小程序)

    惯例附上前几个博客的链接: MFC入门(一)简单配置:http://blog.csdn.net/zmdsjtu/article/details/52311107 MFC入门(二)读取输入字符:http ...

  8. vc2008中mfc菜单、控件等汉字显示为问号或乱码的解决方法

    在vc2008中建立基于mfc的project.在向导的Application type页面中如果在resource language选项中选择"英语(美国)"(图一),那么在pr ...

  9. 【转】VC2008在工具栏Toolbar里添加XP风格spin box control控件

    Spin box control本是用于对话框中的控件.但有时需要将它放到工具栏上.VC++ 2008里实现如下: 一.在工具栏上新增一个工具按钮项,资源命名为ID_TOOL_EDIT_TIME.再增 ...

最新文章

  1. 排序算法 Java实现
  2. Linux命令之cal
  3. php中mysql函数和mysqli函数的用法区别
  4. Android 说说亮屏锁和键盘锁
  5. Windows 软件安全---注入安全
  6. linux内存管理(八)-不连续页分配和页表
  7. day_05 显示字符A
  8. linux ab 命令参数,linux环境中ab命令简介及结果分析
  9. 闲谈Python语言入门
  10. uni-app实现APP中打开第三方app
  11. NLPCC2013中文微博细粒度情感识别(二)
  12. 美团CAT客户端(windows版)接入指南
  13. ubuntu双系统引导梅花_Ubuntu Windows双系统和USB无线网卡安装的正确方法
  14. 显著性目标检测数据集
  15. 呃,是该坚持些事情了
  16. FFmpeg视频编码步骤
  17. [ASP.NET]下载txt格式的文件
  18. HDU 6135 Casual Podracing(CDQ分治)
  19. vs2019 无法导入 Web 服务/架构。对象“Settings”已包含一个不是 WebServiceUrl 类型的属性
  20. umy-ui使用手册

热门文章

  1. 认识ArcGIS Pro
  2. 查看和删除Java证书
  3. 百度地图批量精度和维度Java_【百度地图API】如何批量转换为百度经纬度
  4. java HashMap 与HashTable的区别
  5. 西安网站设计-你可能还不知道吧!这个方法可以让你的网页更加精美
  6. 关于PNG和JPG两种图片的常识
  7. PV操作每日一题-独木桥问题
  8. SearchView搜索框的功能与用法
  9. Search in Rotated Sorted Array - 循环有序数组查找问题
  10. 这10大专业读研比考研还辛苦!有你的目标专业吗?​