你好,我想用对话框的按键精灵调用子程序调用图片,在对话框上的picture的空间上显示图片,可以帮帮我么

4110人阅读
VC/MFC编程(76)
1、添加一个Picture&Control,关联变量为&m_picture,定义一个全局变量CString&m_path.&&&&2、添加一个打开jpg图片的按钮,并添加按钮事件:void&...Dlg::OnOpen()。&&&&void&...Dlg::OnOpen()&&&&{&&&&CFileDialog&cfd(true,_T(&.jpg&),NULL,OFN_FILEMUSTEXIST|OFN_HIDEREADONLY,_T(&Executable&&&Files&&&(*.jpg)|*.jpg|All&&&Files&&&(*.*)|*.*||&),this);&&&&&&&&if(cfd.DoModal()!=IDOK)&&&&&&&&&&&{&&&&&return;&&&}&&&m_path&=&cfd.GetPathName();&&&&
&&&UpdateData(false);&&&&&&&&&&&&&&&&ShowPicture();&&&&&&&&&&&&&&&&&&&&&}&&&&3、添加函数void&...Dlg::ShowPicture(void)。&&&&void&...Dlg::ShowPicture(void)&&{&&&if(m_path==&&)&&&&&&&&&&&{&&&&return;&&&}&&&&&&CRect&&&&m_picture.GetClientRect(&rect);&&&&&&&&&&CImage&&&&&&&&&&&image.Load(m_path);&&&&&&CDC*&pDC&=&m_picture.GetWindowDC();&&&&&&&image.Draw(&pDC&-&&m_hDC,rect);&&&&&&&&&ReleaseDC(pDC);&&}&&&&4、在void&...Dlg::OnPaint()添加:&&&&void&...Dlg::OnPaint()&&{&&&if&(IsIconic())&&&{&&&&....&&&&&}&&&else&&&{&&&&CDialog::OnPaint();&&&&CDialog::UpdateWindow();&&&&&ShowPicture();&&&&&&&&&&}&&}&&
1.若出现CImage未定义,则包含进头文件:#include &atlimage.h&.
2.若出现:stdafx.obj : error LNK2005: &class ATL::CStringT&char,class StrTraitMFC&char,class ATL::ChTraitsCRT&char& & & m_path& (?m_path@@3V?$CStringT@DV?$StrTraitMFC@DV?$ChTraitsCRT@D@ATL@@@@@ATL@@A)
说明头文件中的变量定义可能出问题了。
我是在stdafx.h头文件中定义了:
CString m_ & &出错;
后将此定义放到我的.C文件中直接定义,编译通过。
3.清除JPG图片:
CStatic* pStatic=
(CStatic*)GetDlgItem(IDC_STATIC1);
pStatic-&SetBitmap(NULL);
m_picture.SetBitmap(NULL);
UpdateData(false);
//更新路径公共变量
ShowPicture();
//调用显示图片函数
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
vc中对话框动态显示图片
VC中要是想动态显示个图片是很麻烦的,可不是设置个文件路径就简单完事的。
网上的资料很多,但是都是出于同一个地方,学习来的看不懂的还是看不懂。而且有些地方存在问题。所以我想把这个教程稍微完善下,不方便公开自己写的代码了。
我们要完成的是,在一个对话框中建立一个图片显示的范围,当我们点击下一张按钮时,这个区域会按照预定设好的顺序显示某个文件夹下的图片。
新建MFC应用程序,对话框模式。
<span style="color:#,在预定区域动态载入图片:核心思想是通过CBitmap,HBITMAP,直接用OnPaint()绘制。
首先在CShowPicDlg类中声明一个变量:CBitmap m_ 双击CShowPicDlg类,光标自动调到class CShowPicDlg : public CDialog处,在protected 之前声明一个全局变量,输入CBitmap m_
<span style="color:#,在对话框资源中加入一个picture 标签,名为IDC_STATIC1。打开ClassWinzard(类向导),在ObjectIDs中选中CShowPicDlg,在下面的Member Functions里找OnInitDialog,双击它所在行,光标自动调到BOOL CShowPicDlg::OnInitDialog处。或者,更简单,在左侧类显示栏里找到OnInitDialog,双击,光标自动导向。然后,对照下面的程序修改BOOL
CShowPicDlg::OnInitDialog里的内容。
这是在子对话框初始化得时候添加的位置,如果想点击“下一张”在更换的话,需要将大括号里的代码放到按钮相关函数的大括号里。
BOOL CShowPicDlg::OnInitDialog()
&&&&& CDialog::OnInitDialog();
&&&& if( m_bmp.m_hObject != NULL )//判断
&&&&&&&& m_bmp.DeleteObject();
/////////载入图片
HBITMAP hbmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),
&c://aaa.bmp&, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION|LR_LOADFROMFILE);
if( hbmp == NULL )
return FALSE;
///////////////////////该断程序用来取得加载的BMP的信息////////////////////////
m_bmp.Attach( hbmp );
DIBSECTION
BITMAPINFOHEADER &bminfo = ds.dsB
m_bmp.GetObject( sizeof(ds), &ds );
int cx=bminfo.biW//得到图像宽度
int cy=bminfo.biH //得到图像高度
/////////////////// ////////////////////////////////
/////////////得到了图像的宽度和高度后,我们就可以对图像大小进行适应,即调整控件的大小,让它正好显示一张图片///////////////////////////
GetDlgItem(IDC_STATIC1)-&GetWindowRect(&rect);
ScreenToClient(&rect);
GetDlgItem(IDC_STATIC1)-&MoveWindow(rect.left,rect.top,cx,cy,true);//调整大小
InvalidateRect(rect);&& //刷新对话框区域 这里很重要!如果不加这句,新更换的图片将不刷新!
return TRUE;// return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
<span style="color:#,图片加载成功了,标签大小也适应了,下面就是绘制绘制图像了。打开classwinzard类向导,重载WM_PAINT消息,或者,更简单的方法,在左侧类显示栏里CShowPicDlg里找到OnPaint() ,双击,光标自动导向。
这里有个事情需要强调,当你的对话框为子对话框时,cpp文件里并没有OnPaint(),你需要在头文件中选择重写函数,选择onpaint()。
void CShowPicDlg::OnPaint()
//////////////以下三种情况任选一种会是不同效果(只能一种存在)///////////
//CPaintDC dc(this);//若用此句,得到的是对话框的DC,图片将被绘制在对话框上.
CPaintDC dc(GetDlgItem(IDC_STATIC1)); //用此句,得到picture控件的DC,图像将被绘制在控件上,建议用此句
//dc.m_hDC=::GetDC(NULL);//若用此两句,得到的是屏幕的DC,图片将被绘制在屏幕上///////////////////////////////////////////////////////
GetDlgItem(IDC_STATIC1)-&GetClientRect(&rcclient);
memdc.CreateCompatibleDC(&dc);
bitmap.CreateCompatibleBitmap(&dc, rcclient.Width(), rcclient.Height());
memdc.SelectObject( &bitmap );
CWnd::DefWindowProc(WM_PAINT, (WPARAM)memdc.m_hDC , 0);
maskdc.CreateCompatibleDC(&dc);
maskbitmap.CreateBitmap(rcclient.Width(), rcclient.Height(), 1, 1, NULL);
maskdc.SelectObject( &maskbitmap );
maskdc.BitBlt( 0, 0, rcclient.Width(), rcclient.Height(), &memdc,
rcclient.left, rcclient.top, SRCCOPY);
brush.CreatePatternBrush(&m_bmp);
dc.FillRect(rcclient, &brush);
dc.BitBlt(rcclient.left, rcclient.top, rcclient.Width(), rcclient.Height(),
&memdc, rcclient.left, rcclient.top,SRCPAINT);
brush.DeleteObject();
// Do not call CDialog::OnPaint() for painting messages
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:230003次
积分:3642
积分:3642
排名:第6028名
原创:117篇
转载:72篇
评论:43条
(1)(2)(5)(2)(3)(4)(5)(3)(5)(4)(4)(3)(1)(14)(2)(2)(7)(1)(7)(17)(3)(3)(5)(2)(4)(6)(4)(2)(2)(3)(3)(4)(2)(4)(4)(4)(2)(11)(11)(3)(4)(4)(1)(3)(1)(1)Display-images-in-the-dialog MFC 在对话框中显示图片,使用picture控件,动态加载BMP格 并 _Window 与窗口 238万源代码下载-
&文件名称: Display-images-in-the-dialog
& & & & &&]
&&所属分类:
&&开发工具: Visual C++
&&文件大小: 5 KB
&&上传时间:
&&下载次数: 40
&&提 供 者:
&详细说明:MFC 在对话框中显示图片,使用picture控件,动态加载BMP格式图片并显示-MFC dialog display pictures
文件列表(点击判断是否您需要的文件,如果是垃圾请在下面评价投诉):
&&读显图片.doc
&近期下载过的用户:
&输入关键字,在本站238万海量源码库中尽情搜索:
&[] - MFC视频播放器,MFC视频播放器顺序随机单曲循环播放模式(VC源代码).zip
&[] - 基于K-L的人脸识别,全面实用,可以参考
&[] - MFC_在对话框显示图片的多种方法。实现了各种显示的方法。
&[] - 对话框美化 添加图片 设置背景 添加音乐
&[] - 在对话框中显示bmp图片,可以通过点选列表框,显示图片资源。设计2个按钮,1个单屏幕,1个4屏幕显示。
&[] - OpenCV MFC 边缘检测 VS2008 MFC下用OpenCV2.0进行图像读取和边缘检测,通过对话框来打开图像文件、然后图像大小进行缩放、适当地显示在图片控件的框架内
&[] - MFC picture控件使用实例,新手必备,可结合opencv使用
&[] - mfc 对话框加载图片文件显示,传入图片文件路径,或者读取文件内容到缓冲区。
&[] - MFC基于对话框的程序,按钮上可以动态导入PNG图片,按钮自适应PNG图片的大小。
&[] - opencv运动视频监测,基于MFC 平台,能有助于大家理解opencv的运用MFC 对话框Picture Control(图片控件)中静态和动态显示Bmp图片 - 推酷
MFC 对话框Picture Control(图片控件)中静态和动态显示Bmp图片
最近有同学问我如何实现MFC基于对话框在图片控件中加载图片?其实使用MFC显示图片的方法各种各样,但是还是有些同学不知道怎样显示.以前在《数字图像处理》课程中完成的软件都是基于单文档的程序,这里介绍两种在对话框picthre控件中显示BMP图片的最简单基础的方法.
~~方法可能并不完美,高手忽略,但是提供一种能运行的方法,希望对刚接触这方面知识的同学有所帮助.可能你觉得文章过于简单或者有些过于详细叙述(点到即可我并不反对),但也为哪些入门同学想想,当初自己也是一头雾水.
一.静态显示bmp图片
创建MFC基于对话框程序,添加一个button1和picture控件,其中“资源视图”中编辑picture控件ID为:IDC_STATIC_PIC.
&&&&&&& 2.在&资源视图&(如果没有,视图中可调用出来)中右键鼠标Dialog处,选择&添加资源&.在对话框中选择Bitmap,点击&导入&,选择本地bmp图片(
建议位图放置在res文件夹中)
.它会添加一张IDB_BITMAP1图片
3.点击button1按钮,在生成的函数中添加如下代码:
void CShowBmpDlg::OnBnClickedButton1()
//从资源中加载图片
//加载指定位图资源 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.运行结果如下图所示:
&&&&&&&&通过上面的截图我们可以发现:该方法是通过资源ID来获取BMP图片的,所以我称之为静态的方法.同时,可能你见到过在添加Picture控件时修改其Type为Bitmap在通过image选择ID的方法.但这里是通过代码来实现的,而且ModifyStyle函数的功能就相当于设置其属性.
~~上图很明显的反应了它显示图片时,如果图片尺寸超过控件size只能显示部分图片.方法我只叙述到这,需要你自己去尝试.曾经在单文档中显示BMP图片时,是通过重载onpaint事件,GetClientRect获取尺寸调用StretchBlt(图像可拉伸压缩)实现(参照
其实LoadBitmap函数已被LoadImage替代,该函数用于装载图标\光标\位图.如下代码所示
可以实现同样的效果
,其中Rockies.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为默认大小
//高度 像素为单位
LR_CREATEDIBSECTION | LR_DEFAULTSIZE | LR_LOADFROMFILE));
二.动态加载bmp图片
动态添加的方法一样,只是添加代码如下(这结合我以前的代码完成).主要的步骤是:
&&&&&&& 1.先定义打开文件对话框,通过它获取bmp图片,其中dlg.DoMal()==IDOK表示按下确认按钮,实现后面操作.如果你学过C#就会发现它的OpenFileDialog控件与这个有些类似.
&&&&&&& 2.然后,获取读取文件的路径和后缀,确保其为bmp时执行读取图片信息,在&
&中,我曾详细讲述过如何读取bmp图片,这里也是二进制读取文件,读取其文件头(BITMAPFILEHEADER)、信息头(BITMAPINFOHEADER)、获取其位图数据.
&&&&&&& 3.最后显示图像到Picture控件中,并通过GetClientRect函数获取矩形区域,显示图像.
void CShowBmpDlg::OnBnClickedButton1()
//打开文件 定义四种格式的文件bmp gif jpg tiff
filter=&所有文件(*.bmp,*.jpg,*.gif,*tiff)|*.*.*.*.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();
//将文件扩展名转换为一个小写字符
pare(_T(&bmp&)) == 0)
//定义变量存储图片信息
BITMAPINFO *pBmpI
//记录图像细节
BYTE *pBmpD
//图像数据
BITMAPFILEHEADER bmpH //文件头
BITMAPINFOHEADER bmpI
CFile bmpF
//记录打开文件
//以只读的方式打开文件 读取bmp图片各部分 bmp文件头 信息 数据
if(!bmpFile.Open(BmpName, CFile::modeRead|CFile::typeBinary))
if (bmpFile.Read(&bmpHeader,sizeof(BITMAPFILEHEADER)) != sizeof(BITMAPFILEHEADER))
if (bmpFile.Read(&bmpInfo,sizeof(BITMAPINFOHEADER)) != sizeof(BITMAPINFOHEADER))
pBmpInfo = (BITMAPINFO *)new char[sizeof(BITMAPINFOHEADER)];
//为图像数据申请空间
memcpy(pBmpInfo,&bmpInfo,sizeof(BITMAPINFOHEADER));
DWORD dataBytes = bmpHeader.bfSize - bmpHeader.bfOffB
pBmpData = (BYTE*)new char[dataBytes];
bmpFile.Read(pBmpData,dataBytes);
bmpFile.Close();
//显示图像
CWnd *pWnd=GetDlgItem(IDC_STATIC_PIC); //获得pictrue控件窗口的句柄
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);
运行程序显示结果如下图所示,点击按钮打开图片,显示图片.
总结:通过这个程序你可以很明显的看到动态加载图片由于是通过获取picture控件矩形来显示图的,图像被拉伸了.而且代码很好的反应了如何获取bmp图像的方法.通过静态的和动态的两种方法讲述.
~~最后希望该文章对大家有所帮助,如果文章中有错误或不足之处,还请海涵.
(By:Eastmount
夜2点半 原创CSDN
PS:《数字图像处理》课程希望大家也可以学习下,你可以自己完成一个软件,你将对图像有更深的认识.以前我们要求实现的功能就包括:图像载入保存、采样量化、直方图显示、线性和非线性变换(对比度拉伸、图像均衡化)、几何运算(最近邻差值和双线性差值)、几何变换(平移、反转、旋转)、图像增强(平滑、锐化Laplacian等各种算子)、边缘检测、图像编码压缩(Huffman编码和游程编码)、图像分割复原、二值图像细化等功能.记得最蛋疼的是DICOM医学图像在Android显示与处理花了很长时间才完成的.
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致在MFC对话框中显示(加载)图片(1)
贡献者:周光1226
本站编辑:杭州厨师培训
在MFC对话框中显示(加载)图片
14:46 我们先从简单的开始吧.先分一个类: (一) 非动态显示图片(即图片先通过资源管理器载入,有一个固定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中 在初始化函数OnInitDialog()中加入: BOOL CTestDlg::OnInitDialog() { CDialog::OnInitDialog();
延伸阅读精彩推荐
厨师培训手册_企业管理_经管营销_专业资料
暂无评价|0人阅读|0次下载|举报文档厨师培训手册_企业管理_经管营销_专业资料。文档贡献者 我 贡献于2013-12...
厨师培训学校课程有哪些对 不少想要学厨师的人来说 ,能不能找到一所好的学校是影响他们一生的大事 ,所以不少人为不知道怎样判断一所学校的好坏而发愁 ,虽然他们...
西餐培训手册_企业管理_经管营销_专业资料。餐饮培训红馆咖啡· 红馆咖啡·西餐厅 咖啡 员工培训手册 2010 年 6 月 1 日 目一 二三 四五六七八九 录 仪容仪...
西餐培训教程_学习总结_总结/汇报_实用文档。西餐历史发展,西餐厅培训心内阁西餐培训第一阶段培训内容:对西餐的认识和西餐在我国的发展,世界流行的几大菜式 的特点...
精彩看点猜你喜欢
中国川菜文化摘要: 川菜是对我国西南地区四川和重庆等地具有地域特色的饮食的统称, 川菜最 大的特点是&一菜一格,百菜百味&.川菜以成都、重庆、川南三个地方菜...
最全的正宗川菜菜谱及做法_生活休闲。最全的正宗川菜菜谱及做法 最全的正宗川菜菜谱及做法 菜谱及 本文档收集了经典川菜回锅肉、夫妻肺片、蚂蚁上树、叫花鸡、东坡...
鲁菜菜谱大全冷菜与拼盘 肉丝拉皮 五香肉干 芝麻肉丝 酱爆肉丁 水晶肘子 盐水大虾 水晶鸡脯 肉菜类 炒肚皮 糖醋里脊 红烧鱼翅 炒里脊丝 蒲棒里脊 芫爆里脊丝 ...
中国八大菜系之鲁菜 1.起源 鲁菜,是起源于山东的齐鲁地方风味,中国汉族的四大菜系(也是八大菜系)之一,源 远流长,底蕴深厚。鲁菜选料考究,刀工精细,技法全面,调味...
经典粤菜大集锦粤菜,即广东地方风味菜,有着悠久的历史,以特有 的菜式和韵味,独树一帜,中国汉族八大菜系之一,发源 于岭南,在国内外享有盛誉。粤菜是一种文化,...
粤菜_育儿理论经验_幼儿教育_教育专区。简要介绍我国八大菜系之中的粤菜粤菜,即广东地方风味菜,是我国著名八大菜系之一,它以特有的菜式和韵 味,独树一帜,在国...
淮扬菜浅谈-诗情画意在江南_职业技术培训_职业教育_教育专区。淮扬菜浅谈-诗情画意在江南摘要:淮扬菜与鲁菜、川菜、粤菜并称为中国四大菜系,指流行于江苏扬州、镇江...
舌尖上的苏菜文化江苏菜,中国四大名菜之一,简称苏菜。由于苏菜和浙菜相近,因此和浙菜统称江 浙菜系。主要以南京、扬州、苏州、淮安、徐州、海州六种地方菜组成。早...

我要回帖

更多关于 按键精灵调用子程序 的文章

 

随机推荐