MFC 对话框Picture Control(图片控件)中静态和动态显示Bmp图片

MFC 对话框Picture Control(图片控件)中静态和动态显示Bmp图片最近有同学问我如何实现 MFC 基于对话框在图片控件中加载图片 其实使用 MFC 显示图片的方法各种各样 但是还是有些同学不知道怎样显示 以前在 数字图像处理 课程中完成的软件都是基于单文档的程序 这里介绍两种在对话框 picthre 控件中显示 BMP 图片的最简单基础的方法 方法可能并不完美 高手忽略 但是提供一种能运行的方法 希望对刚接触这方面知识的同学有所帮助 可能你觉得

        最近有同学问我如何实现MFC基于对话框在图片控件中加载图片?其实使用MFC显示图片的方法各种各样,但是还是有些同学不知道怎样显示.以前在《数字图像处理》课程中完成的软件都是基于单文档的程序,这里介绍两种在对话框picthre控件中显示BMP图片的最简单基础的方法.
       ~~方法可能并不完美,高手忽略,但是提供一种能运行的方法,希望对刚接触这方面知识的同学有所帮助.可能你觉得文章过于简单或者有些过于详细叙述(点到即可我并不反对),但也为哪些入门同学想想,当初自己也是一头雾水.
一.静态显示bmp图片
       
1.创建MFC基于对话框程序,添加一个button1和picture控件,其中“资源视图”中编辑picture控件ID为:IDC_STATIC_PIC.
        2.在”资源视图”(如果没有,视图中可调用出来)中右键鼠标Dialog处,选择”添加资源”.在对话框中选择Bitmap,点击”导入”,选择本地bmp图片(建议位图放置在res文件夹中).它会添加一张IDB_BITMAP1图片.


MFC 对话框Picture Control(图片控件)中静态和动态显示Bmp图片

void CShowBmpDlg::OnBnClickedButton1() { //从资源中加载图片 CBitmap bitmap; //加载指定位图资源 Bmp图片ID bitmap.LoadBitmap(IDB_BITMAP1); //获取对话框上的句柄 图片控件ID CStatic *p=(CStatic *)GetDlgItem(IDC_STATIC_PIC); //设置静态控件窗口风格为位图居中显示 p->ModifyStyle(0xf,SS_BITMAP|SS_CENTERIMAGE); //将图片设置到Picture控件上 p->SetBitmap(bitmap); }

        4.运行结果如下图所示:

MFC 对话框Picture Control(图片控件)中静态和动态显示Bmp图片

void CShowBmpDlg::OnBnClickedButton1() { //获取对话框上图片控件的句柄 CStatic* pWnd = (CStatic*)GetDlgItem(IDC_STATIC_PIC); //设置静态控件窗口风格为位图居中显示 pWnd->ModifyStyle(0xf,SS_BITMAP|SS_CENTERIMAGE); //显示图片 pWnd->SetBitmap((HBITMAP)::LoadImage(NULL, _T("Rockies.bmp"), //资源号或本地文件名 IMAGE_BITMAP, //装载位图 IMAGE_CURSOR光标 IMAGE_ICON图标 0, //宽度 0为默认大小 0, //高度 像素为单位 LR_CREATEDIBSECTION | LR_DEFAULTSIZE | LR_LOADFROMFILE)); }

二.动态加载bmp图片
       
动态添加的方法一样,只是添加代码如下(这结合我以前的代码完成).主要的步骤是:
        1.先定义打开文件对话框,通过它获取bmp图片,其中dlg.DoMal()==IDOK表示按下确认按钮,实现后面操作.如果你学过C#就会发现它的OpenFileDialog控件与这个有些类似.

 

MFC 对话框Picture Control(图片控件)中静态和动态显示Bmp图片

void CShowBmpDlg::OnBnClickedButton1() { //打开文件 定义四种格式的文件bmp gif jpg tiff CString filter; filter="所有文件(*.bmp,*.jpg,*.gif,*tiff)|*.bmp;*.jpg;*.gif;*.tiff| BMP(*.bmp)|*.bmp| JPG(*.jpg)|*.jpg| GIF(*.gif)|*.gif| TIFF(*.tiff)|*.tiff||"; CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY,filter,NULL); //按下确定按钮 dlg.DoModal() 函数显示对话框 if( dlg.DoModal() == IDOK ) { //打开对话框获取图像信息 CString BmpName = dlg.GetPathName(); //获取文件路径名 如D:\pic\abc.bmp CString EntName = dlg.GetFileExt(); //获取文件扩展名 EntName.MakeLower(); //将文件扩展名转换为一个小写字符 if(EntName.Compare(_T("bmp")) == 0) { //定义变量存储图片信息 BITMAPINFO *pBmpInfo; //记录图像细节 BYTE *pBmpData; //图像数据 BITMAPFILEHEADER bmpHeader; //文件头 BITMAPINFOHEADER bmpInfo; //信息头 CFile bmpFile; //记录打开文件 //以只读的方式打开文件 读取bmp图片各部分 bmp文件头 信息 数据 if(!bmpFile.Open(BmpName, CFile::modeRead|CFile::typeBinary)) return; if (bmpFile.Read(&bmpHeader,sizeof(BITMAPFILEHEADER)) != sizeof(BITMAPFILEHEADER)) return; if (bmpFile.Read(&bmpInfo,sizeof(BITMAPINFOHEADER)) != sizeof(BITMAPINFOHEADER)) return; pBmpInfo = (BITMAPINFO *)new char[sizeof(BITMAPINFOHEADER)]; //为图像数据申请空间 memcpy(pBmpInfo,&bmpInfo,sizeof(BITMAPINFOHEADER)); DWORD dataBytes = bmpHeader.bfSize - bmpHeader.bfOffBits; pBmpData = (BYTE*)new char[dataBytes]; bmpFile.Read(pBmpData,dataBytes); bmpFile.Close(); //显示图像 CWnd *pWnd=GetDlgItem(IDC_STATIC_PIC); //获得pictrue控件窗口的句柄 CRect rect; pWnd->GetClientRect(&rect); //获得pictrue控件所在的矩形区域 CDC *pDC=pWnd->GetDC(); //获得pictrue控件的DC pDC->SetStretchBltMode(COLORONCOLOR); StretchDIBits(pDC->GetSafeHdc(),0,0,rect.Width(),rect.Height(),0,0, bmpInfo.biWidth,bmpInfo.biHeight,pBmpData,pBmpInfo,DIB_RGB_COLORS,SRCCOPY); } } }

        运行程序显示结果如下图所示,点击按钮打开图片,显示图片.
 

MFC 对话框Picture Control(图片控件)中静态和动态显示Bmp图片

 

MFC 对话框Picture Control(图片控件)中静态和动态显示Bmp图片

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/232201.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • JS中鼠标拖拽div(2)(setCapture()方法和releaseCapture()方法)

    JS中鼠标拖拽div(2)(setCapture()方法和releaseCapture()方法)接着鼠标拖拽div(1)解决问题,当在拖拽事件所在的页面按下键盘的ctrl+A全选后,再去拖拽div,浏览器会默认去搜索网页中的内容,拖拽功能就会失效,(搜索网页内容是浏览器的默认行为,所以要想不发生这种情况,就得将其取消,是谁执行之后触发了浏览器的默认行为,就在谁里面returnfalse即可取消浏览器的默认行为,但这种方式ie8及以下的版本不支持。)在ie8及以下版本浏览器中,如果调用了元素的setCapture()方法,那么点击任何事物都会来执行这个元素绑定的响应函数。例如:btn.oncl

    2022年5月8日
    53
  • 如何在pycharm中进行全局搜索

    如何在pycharm中进行全局搜索使用doubleshift可以在整个项目中搜索含关键字在项目中的位置及关键字在文件中的位置。

    2022年5月15日
    54
  • 常用 SQL 语句大全[通俗易懂]

    常用 SQL 语句大全[通俗易懂]本文总结了开发工作中常用的SQL语句,供大家参考……–语句功能–数据操作SELECT–从数据库表中检索数据行和列INSERT–向数据库表添加新数据行DELETE–从数据库表中删除数据行UPDATE–更新数据库表中的数据–数据定义CREATETABLE–创建一个数据库表DROPTABLE–从数据库中删除表ALTERTABLE–修改数据库表结构CREA

    2022年6月22日
    27
  • 关于Random.nextInt()方法详解「建议收藏」

    关于Random.nextInt()方法详解「建议收藏」博主在阅读>这本书时,发现其中有一个使用Random.readInt()的示例,便在idea上敲着看。发现运行结果与书上的一模一样。不禁让我好奇了起来。如下图:                 如果你也照着敲了一遍的话,我相信结果如下:                  问题来了!random.read

    2022年7月22日
    7
  • 华为海关单据识别服务–基于文字识别技术[通俗易懂]

    华为海关单据识别服务–基于文字识别技术[通俗易懂]业务背景目前,华为公司在海外设有4大供应中心,海关报关单全球一年有35w份左右(其中中国进口5w份,出口15w份,及香港进出口10w份,其它子公司5w份左右)。现在的单据处理方式还停留在通过人工方式将单据内容手动录入到系统中,人工录入的方式除了效率低以外,还存在员工疏忽或者疲劳导致的误操作。如何快速、准确的处理如此数量庞大的单据成为了供应链的一大诉求。问题描述海关报关单据是单据中较为常见的一…

    2022年9月21日
    3
  • 一问彻底理解dubbo主流程

    一问彻底理解dubbo主流程

    2021年8月4日
    49

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号