类似画图板的小程序

最近做了一个类似Windows画图板的小程序,拿来和大家分享一下。功能和界面全部模仿于Windows自带的画图板,界面如截图。功能主要有: 手绘线、简单图形、文字输入、图块拖放、重复撤销、画面缩放、打开保存图片文件,另外为了直接从数据库或者XML中存取图片,另外还提供了从Base64编码存取图片的接口,其他还实现了和画图板同样效果的工具箱及颜料盒。

1、绘图:

绘制功能主要在OnLButtonDown、OnMouseMove、OnLButtonUp中实现,根据当前选择的工具和工具的样式进行绘制。程序中每种工具的绘制都是通过一个图元对象实现,比如钢笔、画刷因为本质上都是手绘线所以都通过CDrawPen来实现、直线和矩形等都通过CDrawShape来实现,所有的图元对象都放在文件DrawObject.h中,具体的实现请参见代码。 另外为了避免屏幕的闪烁,程序中做了两个处理:一、把视图自己的重绘背景代码屏蔽掉,即响应视图的WM_ERASEBKGND消息,直接返回TRUE,并在Ondraw中程序自己绘制背景就可以了;二,在Ondraw中绘制的时候,先绘制到内存DC中,然后再贴回视图的DC。这样就基本上就可以避免屏幕的闪烁了。

2、撤销重做:

由于整个程序较为简单,就没有采用把动作记录下来的方式,只是采取了一个较简单的方法,在每当一个图元绘制动作结束时就把画布的内容存到bmp中以备撤销,这些历史画面存放在一个bmp数组中,并定义了一个Stack类来管理该数组(此实现方式参考了在线杂志21期《类似画笔的绘图控件-卫琳》,在此表示感谢!),然后在屏幕上绘制的时候就是把当前位图贴到屏幕上,并把还没存取位图的图元绘上就行了。

3、缩放:

一般视图缩放的实现是通过DC的两个函数来实现:SetViewportExt和SetWindowExt,但是这两个函数只在MM_ISOTROPIC和MM_ANISOTROPIC这两种映射模式下有效果,而常用的带滚动条的视图类CScrollView却不支持这两种模式(参见CScrollView::SetScrollSizes)的实现。所以只好把MFC的CScrollView的代码拿过来改了一下以支持MM_ISOTROPIC映射模式,如下所示,具体参见程序文件“ADMMScrollView.h”:

::SetMapMode(hdc,MM_ISOTROPIC);
int XLogMm = ::GetDeviceCaps(hdc, HORZSIZE);
int YLogMm = ::GetDeviceCaps(hdc, VERTSIZE);
int XLogPix = ::GetDeviceCaps(hdc, HORZRES);
int YLogPix = ::GetDeviceCaps(hdc, VERTRES);
::SetWindowExtEx(hdc,XLogMm*100,YLogMm*100,NULL);
::SetViewportExtEx(hdc,(int)(XLogPix*fZoomScale),(int)(YLogPix*fZoomScale),NULL);

4、工具箱:

首先为了实现工具箱的按钮分两列显示的效果,需要设置一下按钮的TBBS_WRAPPED,参见程序中的CToolPaletteBar类;然后,选择不同工具时展现出工具的样式,比如选择“直线”时列出可用的直线宽度样式,该功能通过在ToolBar上放一个CListCtrl实现,当前的工具样式通过图标的方式展现,效果和画图板的类似。

5、颜料盒:

从CDialogBar类继承了一个类,然后在WM_PAINT响应函数里面绘制一个个小颜色矩形,并重写其OnLButtonDown、OnRButtonDown、OnLButtonDblClk来和用户交互,实现出来的效果还不错,看上去和画图板的颜料盒一样。

6、鼠标光标样式:

首先在资源文件中增加需要的光标资源,然后在视图的OnSetCursor消息函数中调用SetCursor函数来设置光标样式就可以了,注意要判断HitTest参数是否为HTCLIENT,不然的话鼠标移到了滚动条上的时候光标还是画笔的样式就让人觉得怪怪的了。

最后总结一下,和Windows的画图板相比,这个小程序除了具有画图板基本上所有的功能外,还有这样一些优点: 方便的文字输入功能并且可以设置字体和文本的颜色、多步的撤销重做功能、从BASE64编码存取图片。希望对需要的朋友有所帮助。

本文配套源码

时间: 2024-08-08 01:47:57

类似画图板的小程序的相关文章

菜鸟求指点:有关JAVA制作画图板程序

问题描述 先请求一下,哪位有程序员联合开发网账号的大虾可不可以帮忙下载一下如下两个源码:http://www.pudn.com/downloads133/sourcecode/java/detail565171.htmlhttp://www.pudn.com/downloads116/sourcecode/java/detail493169.html邮箱:bowway@gmail.com谢谢!!!!正题:本人不是学计算机的,但是我的硕士论文需要一个工具来采集数据,就是一个可以让用户使用程序提供的

c语言-C语言两个类似的小程序求教区别

问题描述 C语言两个类似的小程序求教区别 第一个程序如下:#include int a=2; int f() { static int n; int m; m=n=0; n++;a++;m++; return n+m+a; } main() { _ int k; for(k=0;k<3;k++) printf("%d,",f()); printf("n");_ } 程序运行结果: 5,6,7, 第二个程序如下: #include int a=2; int f(

Win7怎么用自带画图板裁剪图片?

  Win7怎么用自带画图板裁剪图片?很多用户问小编Win7怎么用自带画图板裁剪图片?有时候需要美化图片,但是对于不懂美图秀秀或者不懂PS的人,对照片或图片进行裁剪,是件困难的事情吧,网上介绍很多关于裁剪图片的教程,但是都比较复杂,还要下载软件.其实win7旗舰版系统自带的自带画图板就可以裁剪图片了,下面小编告诉大家具体的使用方法. 具体方法如下: 1.点开始>所有程序>附件>打开画图选项; 2.点击画图板主页选项左侧的小三角,选择打开一幅图片; 3.点击主页>选择形状>矩形

微信小程序会让前端开发者失业

这两天微信小程序的内测,被这个事件刷屏,让很多前端开发者感觉以后就是铁饭碗了.而我作为一个将近10年的前端开发者,恰恰看到了事情的另外一面,前端开发开发者的饭碗会被后端开发同学,设计师,产品经理以及其他想学习开发小程序的人占领,大部分低水平前端开发者面临失业.我为什么这样说,下面我来给大伙分析下原因: 我们想想在没有微信小程序的时候,前后端怎么来分工: 前端工程师 开发基础组件,页面的静态样式,交互 后端工程师 开发业务逻辑和把数据套在前端写好的静态页面上. 最不擅长是写页面布局,页面交互,开发

在java做的画图板中,如何选中一个已经画好的图形,把它放大、缩小、移动???

问题描述 在java做的画图板中,如何选中一个已经画好的图形,把它放大.缩小.移动???类似windows的画图板功能,急呀,大牛们帮帮忙 解决方案 解决方案二:你要做图形处理的话,在画这个图形的时候就要把图形的数据保存起来,例如:直线就要保存两个端点的坐标,圆就要保存圆心坐标和半径.然后根据操作,对保存的数据进行相应的处理,再重画图形.建议看下图形学的一些知识.解决方案三:可是我只是个菜鸟,不会那些呀,怎么能选中图形呢?解决方案四:packageaa;importjavax.swing.*;i

将 Java 小程序迁移到 Microsoft J# 浏览器控件

程序|控件|浏览器 Visual J# .NET 小组 Microsoft Corporation 摘要:通过 Microsoft J# 浏览器控件,开发人员可以将所编写的在 Java 虚拟机上运行的 Java 小程序迁移到 .NET 框架.本文向开发人员介绍 J# 浏览器控件,并说明将 Java 小程序迁移到 .NET 框架的步骤.本文还讨论了其他一些主题,如 J# 浏览器控件的安全性和调试,以及当前版本中不受支持的功能. 下载 HTML 小程序到对象标记转换器 (95KB) 本文假设开发人员

java:画图板的制作

学会了使用按钮监听以及鼠标监听器之后,我们就可以制作一个属于自己的画图板了,以下是我之前制作的一个简易的画图板,功能方面尚还不足,不过已经可以完成铅笔,橡皮,画直线,圆等基本工作了,还可以完成颜色的自由选择,大家不放自己也动手做做吧. 首先是界面类: Java代码 import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.FlowLayout; import ja

java响应鼠标点击事件的小程序

一个很基础的小程序,可以作为一种方法嵌入到其他应用中 import java.awt.Graphics;import java.awt.Event;import java.awt.Color;public class mouse extends java.applet.Applet{int num=0;//计数器初始化int px,py;public boolean mouseDown(Event evt,int x,int y)//鼠标按下事件{px=x;py=y;//鼠标按下时的坐标num+

独家 | 手把手教你用scrapy制作一个小程序 !(附代码)

目录 一.前言 二.原理 2.1 爬取流程 2.2 各部块的解释 2.3 scrapy数据流的分析 三.理解 四.实战 4.1 首先是安装scrapy 4.2 建立项目和下载pycharm以及pycharm的配置 4.3 提取标题名和作者名 4.4 scrapy流程解析 4.5 小项目难度加深 五.对scrapy建立项目的feedback 5.1 如何更快地找 bug 5.2 共存解释器可能导致的种种报错 六.知识补充 6.1 Spider中的类和方法 一. 前言 Scrapy是用于Python