继《MFC制作Windows画图程序(一)》

文章目录

  • 7 颜色填充功能
  • 8 选择画笔颜色
  • 9 设置画笔粗细
  • 10 将绘制出来的图形保存的实现
  • 11 添加位图

7 颜色填充功能

油漆桶功能主要应用了FloodFill函数,该函数的功能是用当前刷从点(x, y)开始向四周填充到颜色为crColor的边界。其中形参m_PointBegin.x和m_PointBegin.y记录了鼠标单击时的位置,m_PenColor记录了之前绘制图形所用的铅笔颜色,这样FloodFill函数就会从鼠标单击时的位置开始如同漫水一样漫向四周,直到之前的铅笔颜色为止。这样就实现了颜色填充功能。
具体实现代码如下:

在OnLButtonUp() 中添加如下代码:case DrawType::Fill:  {CClientDC dc(this);CBrush newBrush(m_BrushColor);oldBrush = dc.SelectObject(&newBrush);dc.SelectObject(newBrush);dc.FloodFill(m_PointBegin.x, m_PointBegin.y, m_PenColor);dc.SelectObject(oldBrush);}

实现效果:

8 选择画笔颜色

在设置画笔颜色的时候我们首先要定义一个CColorDialog对象,这是一个对话框,包含系统定义的颜色的列表,如图所示。当dlg.DoModal()==IDOK时,也就是说对话框弹出来了,并且你点击了对话框上的OK按钮,然后就执行m_PenColor=dlg.GetColor(),将画笔的颜色设置为你选择的颜色。
具体实现如下:

void CMFC_PAINTView::OnMenucolor()
{CColorDialog dlg;if (IDOK == dlg.DoModal()) //弹出对话框
{m_PenColor = dlg.GetColor();//得到颜色
}
}
//在OnMouseMove()中和OnLButtonUp()中都需要添加以下代码:
CPen newPen, *oldPen;
newPen.CreatePen(PS_SOLID, m_PenSize, m_PenColor);
oldPen = dc.SelectObject(&newPen);
//因为是局部变量,所以可以同名。
//在函数最后加dc.SelectObject(oldPen);

效果如下:

9 设置画笔粗细

画笔的粗细设置也和颜色相类似,我们先创建一个对话框,调用GetWindowText函数获取用户输入的值,然后将m_PenSize的值设置为获取到的值,这样就改变了画笔的粗细。

//首先需要创建一个对话框,然后添加一个示例编辑框,给这个框添加一个类CSetPenSizeDialog和变量m_Edit
void CSetPenSizeDialog::DoDataExchange(CDataExchange* pDX)
{CDialog::DoDataExchange(pDX);DDX_Control(pDX, IDC_EDIT1, m_Edit);CString str;m_Edit.GetWindowText(str);m_PenSize = _ttoi(str);
}
//添加事件处理程序,生成函数OnMenuSize(),在View.cpp中得包含头文件“CSetPenSizeDialog.h”
void CMFC_PAINTView::OnMenusize()
{CSetPenSizeDialog dlg;if (IDOK == dlg.DoModal()) {this->m_PenSize = dlg.m_PenSize;}
}

效果如下:

10 将绘制出来的图形保存的实现

1、CreateCompatibleDC 该函数创建一个与指定设备兼容的内存设备上下文环境(DC);
2、filterindex是“打开”或“另存为”对话框(CommonDialog控件)中的一个缺省的过滤器,来打开或者保存文件的文件扩展名。要使用这个属性值,就必须先给filter属性赋值。

添加事件处理程序,生成函数OnFileSave():
void CMFC_PAINTView::OnFileSave()
{CClientDC dc(this);CRect rect;BOOL  showMsgTag;   //是否要弹出”图像保存成功对话框" BOOL saveTag;CString saveFilePath;GetClientRect(&rect);                  //获取画布大小HBITMAP hbitmap = CreateCompatibleBitmap(dc, rect.right - rect.left, rect.bottom - rect.top);//创建兼容位图HDC hdc = CreateCompatibleDC(dc);      //创建兼容DC,以便将图像保存为不同的格式HBITMAP hOldMap = (HBITMAP)SelectObject(hdc, hbitmap);//将位图选入DC,并保存返回值 BitBlt(hdc, 0, 0, rect.right - rect.left, rect.bottom - rect.top, dc, 0, 0, SRCCOPY);//将屏幕DC的图像复制到内存DC中CImage image;image.Attach(hbitmap);                //将位图转化为一般图像saveTag = FALSE;if (!saveTag)                      //如果图像是第一次被写入,则打开对话框{showMsgTag = TRUE;CString  strFilter = _T("位图文件|*.bmp|JPEG 图像文件|*.jpg|GIF图像文件 | *.gif | PNG图像文件 | *.png |其他格式| *.* |");CFileDialog dlg(FALSE, _T("bmp"), _T("iPaint1.bmp"), NULL, strFilter);if (dlg.DoModal() != IDOK)return;CString strFileName;          //如果用户没有指定文件扩展名,则为其添加一个CString strExtension;strFileName = dlg.m_ofn.lpstrFile;if (dlg.m_ofn.nFileExtension = 0)               //扩展名项目为0{switch (dlg.m_ofn.nFilterIndex){case 1:strExtension = "bmp"; break;case 2:strExtension = "jpg"; break;case 3:strExtension = "gif"; break;case 4:strExtension = "png"; break;default:break;}strFileName = strFileName + "." + strExtension;}saveFilePath = strFileName;     //saveFilePath为视类中的全局变量,类型为CString}else{showMsgTag = FALSE;}//AfxMessageBox(saveFilePath);               //显示图像保存的全路径(包含文件名)HRESULT hResult = image.Save(saveFilePath);     //保存图像if (FAILED(hResult)){MessageBox(_T("保存图像文件失败!"));}else{if (showMsgTag)MessageBox(_T("文件保存成功!"));}image.Detach();SelectObject(hdc, hOldMap);
}

效果如下:

11 添加位图

添加图片时,我们先调用GetPathName函数获取选择的文件的文件路径,然后通过LoadImage函数加载图片,用Attach(hBitmap)把位图资源句柄附加到hBitmap对象上,然后创建一个基于位图的画刷,最后就可将位图绘制在客户端。

//添加事件处理程序,生成函数OnFileOpen():
void CMFC_PAINTView::OnFileOpen()
{m_DrawType = DrawType::myLoadImage;CString strPath, filter;          //打开文件,获得图片路径filter = "bmp图片(*.bmp)|*.bmp||";CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY);if (dlg.DoModal() == IDOK) {strPath = dlg.GetPathName();}HBITMAP hBitmap = (HBITMAP)::LoadImage(NULL, strPath, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);  //加载图片CBitmap loadImageBitmap;loadImageBitmap.Attach(hBitmap);BITMAP bitMap;loadImageBitmap.GetBitmap(&bitMap);CBrush newBrush, * oldBrush;newBrush.CreatePatternBrush(&loadImageBitmap);CClientDC dc(this);oldBrush = (CBrush*)dc.SelectObject(&newBrush);dc.Rectangle(0, 0, bitMap.bmWidth, bitMap.bmHeight);dc.SelectObject(oldBrush);
}

效果如下:

MFC制作Windows画图程序(二)相关推荐

  1. MFC制作Windows画图程序(一)

    文章目录 一.开发环境 二.程序功能 三.功能实现 1 铅笔 2 线段 3 特殊形状 4 放大镜 5 橡皮擦 6 添加文本 一.开发环境 Visual Studio,MFC,单文档 二.程序功能 1. ...

  2. html5画图程序,基于HTML5的Windows画图程序

    Windows 画图程序一直伴随着 Windows 各个版本,这个很简单,几乎没有什么用处的程序拥有最基本的绘图功能,很适合用来涂鸦.HTML5 的 Canvas 对象使在线绘图成为可能,虽然 HTM ...

  3. 用JAVA制作一个画图程序

    在日常生活中画图软件给我们带来了许多便利,往大了说可以用它来制作图标,往小了说也可以当做一个涂鸦板消磨时间. 比如:制作个图标 用来画画: 这个画图程序界面如上,这个程序的功能如下: 1.可更改的画笔 ...

  4. 87岁的老奶奶喜欢用windows画图程序作画,而且画得还贼好!

    来自:安说|搜集有趣的事 信息化时代,谁还不会点新技能呢? 你可能认为老年人很难跟上时代的步伐,比如说你的奶奶不会用智能手机,不会发微信,不会使用手机支付等等.但是事实是,他们可能并不是不会,而是不想 ...

  5. 制作Windows Mobile程序安装包

    使用Visual Studio 2005制作wm上的cab安装包 打开项目,解决方案中添加新项,添加"智能设置CAB项目":或者在空VS中新建一个"智能设置CAB项目&q ...

  6. 怎样使用MFC 调用windows系统程序 windows media player

    背景:我需要一个函数,启动windows系统中的程序 windows media player ,用于播放我所指定的音频文件: 问题:百度网上的大多数用法,都是在mfc中插入 windows medi ...

  7. python_制作Windows安装程序包

    一.打包 1.打包.py文件 打包方法请查看另一篇文章: python3_将多个.py文件打包成exe程序并添加图标 二.制作安装包 1.准备已经打包完成的exe文件,如下图 2.下载NSIS VNI ...

  8. 使用MFC制作windows悬浮球

    上周入手一个二手windows平板(目的只是为了玩),发现习惯使用手机悬浮球后,再转到winpad上操作极为不便,比如想显示桌面都要小心翼翼点,切换任务也比较麻烦(本人不习惯开启平板模式,使用的是常规 ...

  9. 【Java】Java GUI制作Windows桌面程序,利用windowbuilder生成界面,使用exe4j打包成可执行文件,使用Inno Setup打包成安装包,超级详细教程

    目录 1.GUI插件 1.1 下载GUI绘制插件 1.2 eclipse中配置windowbuilder插件 2.绘制GUI界面 2.1 建立一个GUI的项目 3.配置Maven项目 3.1新建一个M ...

最新文章

  1. AI科普微视频丨人类的智能是如何产生的?
  2. Cubieboard:享誉国外 Linux 圈子的中国产品
  3. java解析xml生成表格_JAVA读取XML文件并解析 以及 JAVA生成文本文件输出
  4. oracle常用操作指令
  5. 临床外显子组测序分析中的那些坑(中)
  6. 解决ubuntu18.04中python兼容以及pip兼容问题
  7. NYOJ 58 步数最少 【BFS】
  8. 为什么我的Spring @Autowired字段为空?
  9. MSYS以及MinGW安装
  10. 小鼠血清白蛋白包裹四氧化三铁纳米粒
  11. xwork配置文件: 新配置文件覆盖旧文件中的同名Action
  12. 一个关于偷书贼的故事
  13. 【C语言】scanf函数报错
  14. 服装管理系统大一c语言
  15. Nvidia Summer Camp Day34 个人心得
  16. 中国呼叫中心产业投资潜力及运营策略建议报告2021-2027年
  17. gog安装游戏显示服务器问题,修复Windows 10中的GOG游戏显示黑屏问题
  18. 投影仪幕布的开关在哪里_不可错过的智能投影仪幕布处理方法
  19. 2021-05-11sql server导入外部mdf文件发生报错
  20. 【面试练习题】使用编程语言输出1900年~2000年的全部闰年

热门文章

  1. KKBOX音乐——数据分析,用户研究与填坑指南
  2. 死磕YOLO系列,YOLOv1 的大脑、躯干和手脚
  3. win10-yolov5环境搭建
  4. 国内外云服务现状及发展探讨
  5. [转载]坐标系统与投影变换
  6. 考研这么卷,换条路试试​?互联网IT校园招聘信息大全!
  7. 当display:flex弹性布局与position:absolute/fixed定位一起用,会出现的问题与解决方法
  8. 小程序开发实战学习笔记 1
  9. 编程(代码、软件)规范(适用嵌入式、单片机、上位机等)
  10. 全景拍摄—焦距与对焦教程