开发工具:
文件大小: 346kb
下载次数: 0
上传时间: 2009-05-27
详细说明: 最近做了一个类似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,不然的话鼠标移到了滚动条上的时候光标还是画笔的样式就让人觉得怪怪的了。 ...展开收缩
(系统自动生成,下载前可以参看下载内容)
下载文件列表
相关说明
- 本站资源为会员上传分享交流与学习,如有侵犯您的权益,请联系我们删除.
- 本站是交换下载平台,提供交流渠道,下载内容来自于网络,除下载问题外,其它问题请自行百度。
- 本站已设置防盗链,请勿用迅雷、QQ旋风等多线程下载软件下载资源,下载后用WinRAR最新版进行解压.
- 如果您发现内容无法下载,请稍后再次尝试;或者到消费记录里找到下载记录反馈给我们.
- 下载后发现下载的内容跟说明不相乎,请到消费记录里找到下载记录反馈给我们,经确认后退回积分.
- 如下载前有疑问,可以通过点击"提供者"的名字,查看对方的联系方式,联系对方咨询.