【MFC】动态加载Picture Control控件中的图片
【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控件中的图片相关推荐
- C# aspx页面动态加载ascx用户控件 及 利用反射调用其内方法
//控件代码 public partial class WebUserControl : System.Web.UI.UserControl { public void TestMethod( ...
- C++ MFC picture control控件按比例显示任意图片文件(jpg、bmp等)
前段时间做大一专业实训,用MFC做一个图片查看类程序,对于从来没有学过C++的我们来说显示一张图片就是一件很难的事情了,作为小组里唯一一个MFC设计者,我从网上有很多关于MFC图片控件显示的文章,但大 ...
- MFC 对话框中的picture control 控件显示图片
MFC读取图片一般使用自定义的DIB文件.DIB文件集中了处理图片的API函数,这样可以方便我们的图像操作. DIB文件下载路径:DIB文件下载 MFC显示图片有几种方法: 1.在运行界面上选择 文件 ...
- 为系统加载右键注册控件选项【VB 注册控件】
做VB的,经常注册和反注册OCX控件和DLL链 但是,每次都要 "开始"--"运行" --"regsvr32 C:\********\******.o ...
- Android横向滑动加载更多的控件的实现---HorizontalScrollSlideView
Android横向滑动加载更多的控件的实现-HorizontalScrollSlideView 需求 之前公司业务要求做一个横向滑动的,可以加载更多的控件,第一时间想到的就是 RecyclerView ...
- java动态加载jar时,jar中还有第三方jar无法加载的解决方法
java动态加载jar时,jar中还有第三方jar无法加载的解决方法 当java插件化开发时,即一个java程序在运行的情况下动态加载另一个jar,网上大多数的方法如下 public static v ...
- Coolite动态加载CheckboxGroup,无法在后台中获取
Coolite在后台动态加载CheckboxGroup,页面显示都正常,但是在后台去获取选中的checkbox时,使用下方法: /// <summary> ...
- Picture Control 控件 加载图片 画线
编程中遇到问题,如何在已有图片上添加 虚线,图片使用Picture控件显示 参考网页https://bbs.csdn.net/topics/10044979 其中参考程序段如下: 这是我画线的程序: ...
- MFC怎么让图片适应picture control控件的大小
最近做项目时,遇到一个问题,想要让picture control中的图片显示与该控件的大小一致,用的环境是vs2008,添加一个控件后,更改其type为bitmap,此时的控件大小不能改变,需要将Ce ...
最新文章
- 不需要懂得编程,但却可以使用ggplot2画出论文级别的图?
- 腾讯员工:越来越多的新生都想要学计算机专业,好日子长不了
- 每天一个linux命令(25):linux文件属性详解
- hibernate联合主键 注解方式
- Node.js怎么处理数据库中日期类型
- Spring Cloud 设置Feign的日志记录级别
- Ngrok让你的本地Web应用暴露在公网上
- JavaScript-面向对象(构造函数,实例成员,静态成员)
- 【BZOJ-1502】月下柠檬树 计算几何 + 自适应Simpson积分
- pytorch_图片分类_猫狗猴
- 金山词霸没有响应, 金山词霸与卡巴冲突问题解决方法?
- 中国计算机学会推荐国际学术会议和期刊目录——交叉/综合/新兴
- 如何开发Chrome扩展程序
- 玻色量子与华夏、人行、龙盈智达联合发表量子金融研究成果
- 单用户MIMO系统(一):信道信息在发端已知
- 做销售,好心态才有好业绩
- 【采用】信贷业务的25个风险点
- 论文|Item2vec论文中值得细细品味的8个经典tricks和thinks
- 【报告分享】阿里研究院:2020中国淘宝村研究报告(附下载)
- pwnable.kr wp leg