使用基于对话框的MFC应用

一、准备部分

准备如下控件

一个图片控件(picture control),四个按钮,一个文本编辑框(属性设为只读)

为对话框类添加如下成员变量

二、选择图片按钮

在对话框类中的OnPaint函数中,添加如下代码,将图片框背景初始为白色。

 //通过ID获取静态图片控件的所有信息CWnd* pWnd = GetDlgItem(IDC_STATIC);//targetRect用于选择一个矩形区域,记录了其坐标,长、宽等信息CRect rect;//获取句柄指向控件区域的Rect赋给rectpWnd->GetClientRect(&rect);//获取该控件的图像描述表,让其与CDC设备关联CDC* pDc = pWnd->GetDC();//绘制背景背板//使用笔刷CBrush brush(RGB(255, 255, 255));//将笔刷设置给pDcpDc->SelectObject(&brush);//绘制矩形pDc->Rectangle(rect);//回收绘图设置所占用空间ReleaseDC(pDc);

为文本编辑框添加值变量(我这里已经添加过了)

同时为对话框添加两个函数,其实现如下:

void CMFCApplication1Dlg::adjustImage(CWnd* pWnd, CImage image)
{//targetRect用于选择一个矩形区域,记录了其坐标,长、宽等信息CRect rect;//获取句柄指向控件区域的Rect赋给rectpWnd->GetClientRect(&rect);//获取该控件的图像描述表,让其与CDC设备关联CDC* pDc = pWnd->GetDC();  //绘制背景背板CBrush brush(RGB(255,255,255));pDc->SelectObject(&brush);pDc->Rectangle(rect);//设置对要绘图片缩放的方式//窗口句柄,缩放方式SetStretchBltMode(pDc->m_hDC, STRETCH_HALFTONE);//记录要绘画的长与宽int width = image.GetWidth();;int height = image.GetHeight();//如果图片长或宽大于控件区域,就需要调整if (width > rect.Width() || height > rect.Width()) {float xScale = (float)rect.Width() / (float)width;//x轴缩放倍数float yScale = (float)rect.Height() / (float)height;//y轴缩放倍数float ScaleIndex = (xScale <= yScale ? xScale : yScale);//谁更小用谁,以防备出界width =(int)(image.GetWidth() * ScaleIndex);height = (int)(image.GetHeight() * ScaleIndex);}//更新rect区域,为了尽量将区域确定在控件中间rect = CRect(CPoint(rect.CenterPoint().x - width/2,rect.CenterPoint().y-height/2), CSize(width, height));//用来放缩并绘制矩形//若绘图已绘制会返回0//此处使用的是让原图片拷贝到目标位图//窗口句柄,绘图区域,缩放方式image.StretchBlt(pDc->m_hDC, rect, SRCCOPY);//回收绘图设置所占用空间ReleaseDC(pDc);
}void CMFCApplication1Dlg::splitAddress()
{// TODO: 在此处添加实现代码//倒着寻找相同的字符int index = address.ReverseFind('\\');//Right将address中字符从右侧开始数的括号中的x(最大个数)个字符赋给m_strm_str = address.Right(address.GetLength() - index-1);address = address.Left(index+1);
}

随后为“选择图片”按钮添加点击事件

void CMFCApplication1Dlg::OnBnClickedButton4()
{// TODO: 在此添加控件通知处理程序代码CImage image;//存储图片//文件对话框//基本设置  打开(true)/保存(false)  默认扩展名  默认文件名称 可操作类型  正则表达式配对(符合的才会显示) 父对话框  (一般只用得到这几个)CFileDialog dlg(true, _T("*.bmp"), NULL, OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY,_T("image files (*.bmp;*.jpg;*.png)|*.bmp;*.jpg;*.png|"), NULL);//设置打开文件对话框的标题名dlg.m_ofn.lpstrTitle = _T("open Image ");//等待对话框的最后返回值,不是确认消息则结束if (dlg.DoModal() != IDOK)return;//记录地址address = dlg.GetPathName();//切割地址splitAddress();//获取图片窗口CWnd* pWnd = GetDlgItem(IDC_STATIC);//载入图片到imageimage.Load(dlg.GetPathName());//调整图片并绘图adjustImage(pWnd, image);UpdateData(FALSE);
}

此时,导入功能就已经完成了。

三、“上一张”及“下一张”按钮

为对话框类再次添加如下函数

//获取当前目录下的所有图片名,此方法找出来的图片是按顺序排列的
void CMFCApplication1Dlg::findFIle()
{// TODO: 在此处添加实现代码.CFileFind  find;BOOL result = find.FindFile(address+_T("*.*"));while (result) {result = find.FindNextFile();CString fileName = find.GetFileName();int index = fileName.Find(_T("."));CString suffix = fileName.Right(fileName.GetLength()-index-1);if (suffix == _T("jpg") || suffix == _T("bmp") || suffix == _T("png") || suffix == _T("gif")) {m_strs.Append(_T(",")+fileName);}}
}

现在再次在“选择图片”按钮的点击事件最后添加如下代码

 //读取文件加下所有文件findFIle();

为“上一张”及“下一张”按钮添加点击事件后,添加如下代码

//上一张
void CMFCApplication1Dlg::OnBnClickedButton1()
{// TODO: 在此添加控件通知处理程序代码CString path;if (address.IsEmpty()) {//没有图片时MessageBox(_T("没有图片"));return;}int index = m_strs.Find(_T(",")+m_str);if ( index == 0) {//第一张index = m_strs.ReverseFind(',');//找倒数第一个逗号path = m_strs.Right(m_strs.GetLength() - index - 1);//逗号以右赋值}else {//不是第一张path = m_strs.Left(index);//逗号以左赋值index = path.ReverseFind(',');//找切割后的值的倒数第一的逗号path = path.Right(path.GetLength() - index - 1);//逗号以右赋值}m_str = path;path = address+path;CImage image;//获取图片窗口CWnd* pWnd = GetDlgItem(IDC_STATIC);//载入图片到imageimage.Load(path);//调整图片并绘图adjustImage(pWnd, image);UpdateData(FALSE);
}//下一张
void CMFCApplication1Dlg::OnBnClickedButton3()
{// TODO: 在此添加控件通知处理程序代码CString path;if (address.IsEmpty()) {//没有图片时MessageBox(_T("没有图片"));return;}int index = m_strs.Find(_T(",")+m_str);if (index == m_strs.ReverseFind(',')) {//最后一张index = m_strs.Find(_T(","),1);//从第二为开始,找正数第二个逗号if (index == -1)//只有一张图片return;path = m_strs.Left(index);//逗号以左赋值path = path.Right(path.GetLength() - 1);//将切割后的值的第一个逗号以右赋值}else {//不是最后一张path = m_strs.Right(m_strs.GetLength() - index-1);//逗号以右赋值index = path.Find(_T(","));//找切割后的值的第一个逗号path = path.Right(path.GetLength() - index - 1);//逗号以右赋值index = path.Find(_T(","));//找切割后的值的第一个逗号if (index != -1) {//不是倒数第二个path = path.Left(index);//逗号以左赋值}}m_str = path;path = address + path;CImage image;//获取图片窗口CWnd* pWnd = GetDlgItem(IDC_STATIC);//载入图片到imageimage.Load(path);//调整图片并绘图adjustImage(pWnd, image);UpdateData(FALSE);
}

四、自动播放

在对话框类的初始化器,为判断是否自动播放变量初始化。

为上一张和下一张以及自动播放按钮添加控制变量

为自动播放添加点击事件,代码如下

void CMFCApplication1Dlg::OnBnClickedButton2()
{// TODO: 在此添加控件通知处理程序代码if (address.IsEmpty()) {//没有图片时MessageBox(_T("没有图片"));return;}if (m_isAuto == false) {//按钮变化m_isAuto = true;m_Pre.EnableWindow(FALSE);m_Next.EnableWindow(FALSE);m_Auto.SetWindowText(_T("暂停播放"));//启动定时器SetTimer(1, 1000, NULL);}else {//按钮变化m_isAuto = false;m_Pre.EnableWindow(TRUE);m_Next.EnableWindow(TRUE);m_Auto.SetWindowText(_T("自动播放"));//关闭定时器KillTimer(1);}
}

为对话框类添加定时器消息


void CMFCApplication1Dlg::OnTimer(UINT_PTR nIDEvent)
{// TODO: 在此添加消息处理程序代码和/或调用默认值//调用“下一张”按钮的函数OnBnClickedButton3();CDialogEx::OnTimer(nIDEvent);
}

至此完成了一个图片查看器的基本功能。

注:至于重新调整大小会变白,是因为笔者将背景涂白的部分放入了OnPaint中,OnPaint在每一次窗口重新绘制时,都会调用。此外,本程序只读取了jpg,png,gif,bmp图片,若有需要请自己修改。

用MFC制作一个图片浏览器相关推荐

  1. 易语言 图片插入超级列表框_利用PPT制作一个图片抽奖

    上课时,为了参加互动的效果,抽奖是一个很好的方法,即能提高学生的学习兴趣也能活跃课堂气氛. 老师们大多使用的课件都是PPT,而PPT实现这种效果有点难度.百度中有介绍如何使幻灯片切换功能实现名字抽奖的 ...

  2. C#制作一个图片查看器,具有滚轮放大缩小,鼠标拖动,图像像素化,显示颜色RGB信息功能

    目录 前言 一.界面设计 二.关键技术 1.把图片拖入到窗体并显示 2.实现图像缩放的功能 3.实现图像的移动效果 4.实时显示当前鼠标处的RGB值 5. 右击功能的实现 6.效果展示 总结 前言 使 ...

  3. 用MFC制作一个倒计时小程序

    用MFC制作一个倒计时小程序 1.思路: 1)初始步骤1:新建一个工程,选择MFC AppWizard(exe),工程名命名为CdTimer,选择基于对话框形式的应用程序,将此主对话框用于显示剩余的时 ...

  4. 百度--搜索引擎是怎么实现的--如何制作一个搜索浏览器

    1.搜索引擎是怎么实现的? 搜索引擎是通过以下步骤实现的: 网页抓取(Crawling):搜索引擎会使用网络爬虫(Web Crawler)自动地从互联网上抓取网页内容.爬虫按照一定的规则遍历网页并提取 ...

  5. 使用imagine/imagine实现制作一个图片

    在一般的后台系统中,管理员一般有一个默认的头像,有的系统是直接给没有设置头像的用户分配一个默认的图片作为默认头像,但是有的系统是根据管理员的用户名来生成一张默认的图片,这里我们使用imagine/im ...

  6. 用Qt设计一个图片浏览器

    本人分享的是不用ui界面的图片浏览器,它可以从系统文件里面选取各种格式的图片(可以自己设置),然后点击左右的按钮来浏览这些图片,而且还支持图片多选的功能. 以下是Widget.h中的代码: #ifnd ...

  7. QT制作一个图片播放器

    前言:使用qt制作了一个简单的图片播放器,可以播放gif.png等格式图片 先来看看播放器的功能(当然是很简陋的,没有很深入的设计): 1.点击图片列表中图片进行播放. 2.自动播放,播放的图片的间隔 ...

  8. 用Vue制作一个图片翻面效果

    1.创建文件夹 创建文件夹PhotoTest. 并在当前文件夹下创建img包用来存储图片. 把vue.js文件复制到PhotoTest文件夹下. 文件目录如下. 2.图片切片 随便找一张图片在(ps) ...

  9. 用C#编写一个图片浏览器,实现鼠标控制图片的平移缩放与图片的灰度化

    1. 界面设计 如图1 所示:一个名为ImView 的Form 只中包含有一个名为picturebox 的Picturebox.图2 是它的运行结果.该程序的界面设计较为简单,主要根据鼠标行为及键盘按 ...

最新文章

  1. 掌贝获2000万美元B+轮融资,和智投资领投、味千中国和金沙江创投跟投
  2. 2019第十二届“认证杯”数学建模(第二阶段)
  3. 用积木做了个无人机。
  4. 致电以验证您的JavaFX UI的响应能力
  5. php创建一个类,JavaScript_创建一个类Person的简单实例,创建一个类Person,包含以下属 - phpStudy...
  6. mac+php版本切换+cli,Mac环境下php版本切换
  7. PostgreSQL之日期字段统一加一天
  8. *TEST 7 for NOIP 玄学解题 (150/300)
  9. 第五课:BCD计数器设计与验证
  10. 部分设计模式案例代码
  11. IllegalArgumentException: Unmatched braces in the pattern.
  12. Python 爬取微博、百度实时热点
  13. java调用百度AI实现图文识别功能
  14. Java+Selenium+Chrome、Firefox自动化测试环境搭建
  15. Python爬取2345天气网
  16. 013 Rust死灵书之类型转换
  17. Fortinet :《2021 年OT与网络安全现状报告》之「要点综述」
  18. 关于xftp突然无法连接虚拟机
  19. Web前端面试指导 四 面试前准备-有备而去百战百胜
  20. 为什么Git把SVN拍在了沙滩上?

热门文章

  1. Google拼音顿号输入及自定义短语
  2. 常用的http状态码查询大全
  3. BaoStock:一个免费、开源的python证券数据接口包
  4. 福禄克DSX-5000如何测试光缆
  5. excel自定义模板解析
  6. 学习Java日志框架之——搞懂JUL(java.util.logging)
  7. 冒险岛2计算机内存不足建议使用,冒险岛2重新规划的每日 减负后每天必做的日常...
  8. 校招行测笔试-数量关系
  9. BAT设计师推荐的非常好用的15个优质SKETCH插件
  10. 【重磅】AlphaZero炼成最强通用棋类AI,DeepMind强化学习算法8小时完爆人类棋