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

  • 前言
  • 方法1:CBrush
  • 方法2:SetBitmap
    • 参考链接
  • 方法3:重写MyPictureControl

前言

在MFC窗体中,我们经常需要根据不同的需求来动态显示Pictrue Control上的图片。以下提供若干种方法来实现动态加载图片的目的。

方法1:CBrush

通过画刷方式,将图片刷在界面上,该方法效率较高,只要确保能够及时释放内存,不易造成内存泄漏的风险。

在主线程CTestDlg创建SetBmp()函数来设置图片。

void CTestDlg::SetBmp()
{CStatic                m_pic;      //Picture Control控件CDC                  *pDC;CBitmap                bmp;CBrush              brush;CRect             rect;pDC = m_pic.GetDC();m_pic.GetClientRect(&rect);bmp.LoadBitmap(IDB_BITMAP_1);  //IDB_BITMAP_1通过资源管理器加载好的图片brush.CreatePatternBrush(&bmp);  //创建位图画刷pDC->FillRect(rect, &brush); //用背景画填充区域bmp.DeleteObject();ReleaseDC(pDC);        //释放资源
}

注意
通过画刷加载的图片,并不是替换掉控件默认载入的图片,所以当你移动窗口或者窗口刷新时,通过该方法加载的图片会被刷掉。

方法2:SetBitmap

//pictureResource为图片资源的ID
//CStatic mPictureViewer;为图片控件变量
void CMyForm::ShowPicture(UINT pictureResource)
{CBitmap bitmap;//创建CBitmap对象用于存放我们需要加载的图片HBITMAP hbmp;//用于记录图片加载后的句柄bitmap.LoadBitmap(pictureResource);//加载图片资源hbmp = (HBITMAP)bitmap.GetSafeHandle();//获取图片句柄this->mPictureViewer.SetBitmap(hbmp);//为空间设置图片//为了让图片自动缩放以适应空间的尺寸 需要获取图片尺寸信息BITMAP bmpInfo;//存储图片信息用于获取图片的宽度和高度bitmap.GetBitmap($bmpInfo);int bmpWith = bmpInfo.bmWidth;//图片宽度int bmpHeight = bmpInfo.bmHeight;//图片高度CRect rect;//记录Picture Control控件的尺寸this->mPictureViewer.GetClientRect(&rect);int nx = rect.left + (rect.Width() - bmpWidth) / 2;//计算图片插入位置xint ny = rect.top + (rect.Height() - bmpHeight) / 2;//计算图片插入位置yCDC *pDC = this->mPictureViewer.GetDC();//获取DCpDC->SetStretchBitMode(COLORONCOLOR);//设置图片模式CDC dcMemory;dcMemory.CreateCompatibleDC(pDC);CBitmap *pOldBitmap = dcMemory.SelectObject(&bitmap);pDC->StretchBit(0,0,rect.Widht(),rect.Height(),&dcMemory,0,0,bmpWidth,bmpHeight,SRCCOPY);ReleaseDC(pDC);//释放DC 注意获取后必须释放}
//实现重绘时更新图片
void CMyForm::OnPaint()
{CPaintDC dc(this);//myPictureResource为当前需要显示图片的id//或者根据实际情况在调用ShowPicture之前 获取到该ID即可ShowPicture(myPictureResource);
}

该方案通过SetBitmap可以将图片直接加载进控件当中,并且不会被窗口事件刷新,并且可以根据图片尺寸自动调整以适应控件尺寸。

该方法适合用在不需要经常更新图片的应用场景中,一旦出现Picture Control控件需要频繁加载图片时,该方法容易出现内存泄漏的风险。

参考链接

方法2参考链接: MFC应用程序中如何动态更新Picture Control中的图片.

方法3:重写MyPictureControl

方法1和方法2都能够实现Picture Control控件动态加载图片,但是方法1需要不断调用,来避免被窗口事件刷新,而方法2一旦在频繁加载图片的应用场景中,就会有内存泄漏的风险。

所以我在方法1的基础上,通过继承STATIC类,重写MyPictureControl类,在OnPaint()函数内做加载图片的处理,既保证了效率,也避免了图片会被刷新掉的风险。

void CMyPictureControl::OnPaint()
{CPaintDC dc(this); // device context for painting// TODO: 在此处添加消息处理程序代码CRect               rect;CBrush             brush;CBitmap               bmp;GetClientRect(&rect);bmp.LoadBitmap(IDB_BITMAP_1);  //IDB_BITMAP_1通过资源管理器加载好的图片brush.CreatePatternBrush(bmp);dc.FillRect(rect, &brush);bmp.DeleteObject();brush.DeleteObject();// 不为绘图消息调用 CStatic::OnPaint()
}

注意:

为了提升MyPictureControl类的灵活性,可以将bmp作为成员变量传递进来,再通过Invalidate(0)来更新控件,触发OnPaint()函数。

代码例程: Picture Control控件自写类实现动态加载图片功能.

【MFC】动态加载Picture Control控件中的图片相关推荐

  1. C# aspx页面动态加载ascx用户控件 及 利用反射调用其内方法

    //控件代码 public partial class WebUserControl : System.Web.UI.UserControl {     public void TestMethod( ...

  2. C++ MFC picture control控件按比例显示任意图片文件(jpg、bmp等)

    前段时间做大一专业实训,用MFC做一个图片查看类程序,对于从来没有学过C++的我们来说显示一张图片就是一件很难的事情了,作为小组里唯一一个MFC设计者,我从网上有很多关于MFC图片控件显示的文章,但大 ...

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

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

  4. 为系统加载右键注册控件选项【VB 注册控件】

    做VB的,经常注册和反注册OCX控件和DLL链 但是,每次都要 "开始"--"运行" --"regsvr32 C:\********\******.o ...

  5. Android横向滑动加载更多的控件的实现---HorizontalScrollSlideView

    Android横向滑动加载更多的控件的实现-HorizontalScrollSlideView 需求 之前公司业务要求做一个横向滑动的,可以加载更多的控件,第一时间想到的就是 RecyclerView ...

  6. java动态加载jar时,jar中还有第三方jar无法加载的解决方法

    java动态加载jar时,jar中还有第三方jar无法加载的解决方法 当java插件化开发时,即一个java程序在运行的情况下动态加载另一个jar,网上大多数的方法如下 public static v ...

  7. Coolite动态加载CheckboxGroup,无法在后台中获取

    Coolite在后台动态加载CheckboxGroup,页面显示都正常,但是在后台去获取选中的checkbox时,使用下方法:         /// <summary>          ...

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

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

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

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

最新文章

  1. 不需要懂得编程,但却可以使用ggplot2画出论文级别的图?
  2. 腾讯员工:越来越多的新生都想要学计算机专业,好日子长不了
  3. 每天一个linux命令(25):linux文件属性详解
  4. hibernate联合主键 注解方式
  5. Node.js怎么处理数据库中日期类型
  6. Spring Cloud 设置Feign的日志记录级别
  7. Ngrok让你的本地Web应用暴露在公网上
  8. JavaScript-面向对象(构造函数,实例成员,静态成员)
  9. 【BZOJ-1502】月下柠檬树 计算几何 + 自适应Simpson积分
  10. pytorch_图片分类_猫狗猴
  11. 金山词霸没有响应, 金山词霸与卡巴冲突问题解决方法?
  12. 中国计算机学会推荐国际学术会议和期刊目录——交叉/综合/新兴
  13. 如何开发Chrome扩展程序
  14. 玻色量子与华夏、人行、龙盈智达联合发表量子金融研究成果
  15. 单用户MIMO系统(一):信道信息在发端已知
  16. 做销售,好心态才有好业绩
  17. 【采用】信贷业务的25个风险点
  18. 论文|Item2vec论文中值得细细品味的8个经典tricks和thinks
  19. 【报告分享】阿里研究院:2020中国淘宝村研究报告(附下载)
  20. pwnable.kr wp leg

热门文章

  1. Mahalanobis距离(马氏距离)
  2. map和multimap的用法详解
  3. fragment 淡入淡出_Android ViewPager随着不同的动画,如放大,淡入淡出等
  4. 安装fabric-2.2.0
  5. 做阿里云代理返佣需要什么样的资格?
  6. 为miniconda设置环境变量
  7. 关于SQL中not exists的双重否定的一些记录
  8. python包离线安装教程_离线安装python包(附示例:featuretools)
  9. KnockoutJS的使用及分析
  10. ubuntu20.04系统安装vmtool工具