MFC对话框显示图片
2016-01-19 15:43
316 查看
我们先从简单的开始吧.先分一个类:
(一) 非动态显示图片(即图片先通过资源管理器载入,有一个固定ID)
(二) 动态载入图片(即只需要在程序中指定图片的路径即可载入)
为方便说明,我们已经建好一个基于对话框的工程,名为Ttest。对话框类为CTestDlg。
(一) 非动态载入图片.
方法1、先从最简单的开始,用picture 控件来实现。
步骤:先在资源里Import一张图片,ID为IDB_BITMAP2;然后在对话框上添加一个picture控件,右键点击打开属性;将type下拉框选择BITMAP,紧跟着下面就出现一个Image下拉框;拉开就会看到所有已经载入好的图片,选择你要的图片,运行程序即可看到。
方法2、通过背景图
同样如上,先载入一张图片,ID为IDB_BITMAP2。
TestDlg.h中,定义CBrush m_brBk; //在public中定义
TestDlg.cpp中
再打开类向导,找到WM_CTLCOLOR消息,重载得对应函数OnCtlColor()。
(二) 动态载入图片
方法3、图像控件(本例用KoDak 图像编辑控件)
1. 首先应该保证系统中有这个控件。注意,它不能单独使用,必须和其他几个控件(特别是Imgcmn.dll)一同使用。如果没有,从别的机器上copy过来即可。这几个文件是Imgadmin.ocx,Imgcmn.dll,Imgedit.ocx,Imgscan.ocx,Imgshl.dll,Imgthumb.ocx,Imgutil.dll,把它们copy到windows/system目录下,然后用regsvr32.exe将它们分别注册。
2. 打开工程,进入资源管理器,在对话框上单击右键,单击Insert Activex control… 选择Kodak图象编辑控件,大小任意。
3. 在对话框上选中该控件,为其添加变量:m_ctrlPicture。
4. 在BOOL CTestDlg::OnInitDialog()添加如下:
方法4 通过CBitmap,HBITMAP,直接用OnPaint()绘制。
首先在CTestDlg类中声明一个变量: CBitmap m_bmp。然后我们在对话框中加入一个picture 标签,名为IDC_STATIC1
(一) 非动态显示图片(即图片先通过资源管理器载入,有一个固定ID)
(二) 动态载入图片(即只需要在程序中指定图片的路径即可载入)
为方便说明,我们已经建好一个基于对话框的工程,名为Ttest。对话框类为CTestDlg。
(一) 非动态载入图片.
方法1、先从最简单的开始,用picture 控件来实现。
步骤:先在资源里Import一张图片,ID为IDB_BITMAP2;然后在对话框上添加一个picture控件,右键点击打开属性;将type下拉框选择BITMAP,紧跟着下面就出现一个Image下拉框;拉开就会看到所有已经载入好的图片,选择你要的图片,运行程序即可看到。
方法2、通过背景图
同样如上,先载入一张图片,ID为IDB_BITMAP2。
TestDlg.h中,定义CBrush m_brBk; //在public中定义
TestDlg.cpp中
BOOL CTestDlg::OnInitDialog() { CDialog::OnInitDialog(); CBitmap bmp; bmp.LoadBitmap(IDB_BITMAP2); m_brBk.CreatePatternBrush(&bmp); bmp.DeleteObject(); return TRUE; // return TRUE unless you set the focus to a control }
再打开类向导,找到WM_CTLCOLOR消息,重载得对应函数OnCtlColor()。
HBRUSH CTestDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); if (pWnd == this) { return m_brBk; } return hbr; }
(二) 动态载入图片
方法3、图像控件(本例用KoDak 图像编辑控件)
1. 首先应该保证系统中有这个控件。注意,它不能单独使用,必须和其他几个控件(特别是Imgcmn.dll)一同使用。如果没有,从别的机器上copy过来即可。这几个文件是Imgadmin.ocx,Imgcmn.dll,Imgedit.ocx,Imgscan.ocx,Imgshl.dll,Imgthumb.ocx,Imgutil.dll,把它们copy到windows/system目录下,然后用regsvr32.exe将它们分别注册。
2. 打开工程,进入资源管理器,在对话框上单击右键,单击Insert Activex control… 选择Kodak图象编辑控件,大小任意。
3. 在对话框上选中该控件,为其添加变量:m_ctrlPicture。
4. 在BOOL CTestDlg::OnInitDialog()添加如下:
BOOL CTestDlg::OnInitDialog() { CDialog::OnInitDialog(); m_ctrlPicture.SetImage("aa.jpg"); //保证图像在工程目录下,也可以写绝对路径 m_ctrlPicture.Display(); return TRUE; // return TRUE unless you set the focus to a control }编译运行就OK了,此种方法的好处就是可能针对多种图像格式。
方法4 通过CBitmap,HBITMAP,直接用OnPaint()绘制。
首先在CTestDlg类中声明一个变量: CBitmap m_bmp。然后我们在对话框中加入一个picture 标签,名为IDC_STATIC1
<pre name="code" class="cpp">BOOL CTestDlg::AddPicture() { Cstring strBmp; HBITMAP hbmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(), strBmp, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION|LR_LOADFROMFILE); if( hbmp == NULL ) return FALSE; m_bmp.Attach( hbmp ); DIBSECTION ds; BITMAPINFOHEADER &bminfo = ds.dsBmih; m_bmp.GetObject( sizeof(ds), &ds ); int cx=bminfo.biWidth; //得到图像宽度 int cy=bminfo.biHeight; //得到图像高度 /////////////得到了图像的宽度和高度后,我们就可以对图像大小进行适应,即调整控件的大小,让它正好显示一张图片////////////////////////// CRect rect; GetDlgItem(IDC_STATIC1)->GetWindowRect(&rect); ScreenToClient(&rect); GetDlgItem(IDC_STATIC1)->MoveWindow(rect.left,rect.top,cx,cy,true);//调整大小 m_bmp.SetBitmap(hbmp); }
相关文章推荐
- C++ AMP异构并行编程解析
- Linux环境下网络编程杂谈
- 一、基础篇 1.1 JVM 1.1.1. Java内存模型,Java内存管理,Java堆和栈,垃圾回收
- 设计模式:观察者模式(基于 Java)
- 浅谈MVVM架构
- 利用jQuery接受和处理xml数据
- 2015GCT顺利结束
- 通过年月求每月天数
- spring boot--creating your own auto-configuration
- bitmap分别设置四角,圆角还是直角,自定义
- 磁盘挂载的步骤
- 多媒体定时器 C的实现
- iOS: iOS9 beta 请求出现App Transport Security has blocked a cleartext HTTP (http://)
- 1-5 数据链路层
- nginx搭建文件服务器
- 下拉列表回选
- JAVA学习日记(1)
- lambda函数表达式写法
- android源码中 C++文件log使用
- 关于元数据与主数据