windows画图的撤销重做是如何实现的?

tracing 2015-03-20 05:06:04
如题,这个画图应该是直接操作图片的像素的,所以不要提设置画笔模式的做法,毕竟不是在DC上画图
...全文
740 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaohuh421 2015-03-24
  • 打赏
  • 举报
回复
windows的画图是操作DC的. 有一个内存DC. 应该是这样实现的. 每次画的图是一个图元, 使用一个列表保存起来. 画图软件在paint的时候, 就遍历列表把每个图元都绘制到"画布"上显示出来. 撤销就是把它从列表中删除而以.
tracing 2015-03-24
  • 打赏
  • 举报
回复
引用 19 楼 beijiguangyong 的回复:
http://goobbe.com/questions/722982/undo-operation-in-picturebox-to-undo-drawn-rectangles-in-c-net
protected void btnUndo_Click(object sender, EventArgs e) { var action = eventStack.pop(); // ignore action as we just want to remove it // now redraw your PictureBox with what's left in the Stack } 这个就是我说的方法,把保存的操作重新做了一遍,这种是可以实现,但比较耗时。 赵4老师的例子跟这个一样吗?
schlafenhamster 2015-03-23
  • 打赏
  • 举报
回复
所以"保存每一步的结果可能好些,"
tracing 2015-03-23
  • 打赏
  • 举报
回复
引用 7 楼 schlafenhamster 的回复:
你这个简单的可以: "如果要撤销第三步" 重做第2步. ;;; 保存每一步的结果可能好些,
重做第二步不一定就能把第三步覆盖掉,填充我只是举个例子,如果第二步和第三步都是矩形呢,两个矩形又没有交集,重做第二步的话,第三步还在
  • 打赏
  • 举报
回复
http://www.pudn.com/downloads138/sourcecode/windows/bitmap/detail591330.html 这个例子给你参考,不完善。
tracing 2015-03-23
  • 打赏
  • 举报
回复
引用 15 楼 zhao4zhong1 的回复:
搜“命令模式”
直接说解决方法把,模式这个词太沉重了
赵4老师 2015-03-23
  • 打赏
  • 举报
回复
搜“命令模式”
schlafenhamster 2015-03-23
  • 打赏
  • 举报
回复
"保存每一步比较耗内存,步数也非常有限" 保存每步差可以省mem, 但花 time
一桶姜山 2015-03-23
  • 打赏
  • 举报
回复
要速度就费内存,要内存就费时间啊,鱼和熊掌
tracing 2015-03-23
  • 打赏
  • 举报
回复
引用 11 楼 schlafenhamster 的回复:
所以"保存每一步的结果可能好些,"
有更好的方法吗,保存每一步比较耗内存,步数也非常有限
schlafenhamster 2015-03-22
  • 打赏
  • 举报
回复
"Paint" 也只能undo 几次, 100次都不到, 你要undo 1000次? 还不如 叫用户 重做.
tracing 2015-03-21
  • 打赏
  • 举报
回复
引用 5 楼 likfeng 的回复:
每次操作都会以某种数据结构保存起来 绘图就是按照操作顺序绘制 撤销、重做就是操作列表的增删
我也是想用这种思路,但是undo不好实现,redo比较简单,比如这个例子 第一步:填充画布为红色 第二步:填充画布为蓝色 第三步:填充画布为绿色 如果要撤销第三步,如何操作呢?如果把第三步之前的都重新做一遍是可以实现,但比较浪费时间
worldy 2015-03-21
  • 打赏
  • 举报
回复
引用 7 楼 schlafenhamster 的回复:
你这个简单的可以: "如果要撤销第三步" 重做第2步. ;;; 保存每一步的结果可能好些,
一个操作很占内存,已经做了1000步了,怎么办?
schlafenhamster 2015-03-21
  • 打赏
  • 举报
回复
你这个简单的可以: "如果要撤销第三步" 重做第2步. ;;; 保存每一步的结果可能好些,
likfeng 2015-03-20
  • 打赏
  • 举报
回复
每次操作都会以某种数据结构保存起来 绘图就是按照操作顺序绘制 撤销、重做就是操作列表的增删
wshcdr 2015-03-20
  • 打赏
  • 举报
回复
要专门去实现这套 UNDO/REDO 的框架的
tracing 2015-03-20
  • 打赏
  • 举报
回复
版主帮我改下标题,改成windows自带画图工具的撤销和重做是如何实现的?
tracing 2015-03-20
  • 打赏
  • 举报
回复
直接操作位图的点,然后把位图显示出来
加载更多回复(1)
最近做了一个类似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,不然的话鼠标移到了滚动条上的时候光标还是画笔的样式就让人觉得怪怪的了。
电脑高手应用技巧荟萃 高手新手都适用的137个技巧.键盘上每个键的作用 F1帮助 F2改名 F3搜索 F4地址 F5刷新 F6切换 F10菜单 CTRL+A全选 CTRL+C复制 CTRL+X剪切 CTRL+V粘贴 CTRL+Z撤消 CTRL+O打开 SHIFT+DELETE永久删除 DELETE删除 ALT+ENTER属性 ALT+F4关闭 CTRL+F4关闭 ALT+TAB切换 ALT+ESC切换 ALT+空格键窗口菜单 CTRL+ESC开始菜单 拖动某一项时按CTRL复制所选项目 拖动某一项时按CTRL+SHIFT创建快捷方式 将光盘插入到CD-ROM驱动器时按SHIFT键阻止光盘自动播放 Ctrl+1,2,3... 切换到从左边数起第1,2,3...个标签 Ctrl+A 全部选中当前页面内容 Ctrl+C 复制当前选中内容 Ctrl+D 打开“添加收藏”面版(把当前页面添加到收藏夹中) Ctrl+E 打开或关闭“搜索”侧边栏(各种搜索引擎可选) Ctrl+F 打开“查找”面版 Ctrl+G 打开或关闭“简易收集”面板 Ctrl+H 打开“历史”侧边栏 Ctrl+I 打开“收藏夹”侧边栏/另:将所有垂直平铺或水平平铺或层叠的窗口恢复 Ctrl+K 关闭除当前和锁定标签外的所有标签 Ctrl+L 打开“打开”面版(可以在当前页面打开Iternet地址或其他文件...) Ctrl+N 新建一个空白窗口(可更改,Maxthon选项→标签→新建) Ctrl+O 打开“打开”面版(可以在当前页面打开Iternet地址或其他文件...) Ctrl+P 打开“打印”面板(可以打印网页,图片什么的...) Ctrl+Q 打开“添加到过滤列表”面板(将当前页面地址发送到过滤列表) Ctrl+R 刷新当前页面 Ctrl+S 打开“保存网页”面板(可以将当前页面所有内容保存下来) Ctrl+T 垂直平铺所有窗口 Ctrl+V 粘贴当前剪贴板内的内容 Ctrl+W 关闭当前标签(窗口) Ctrl+X 剪切当前选中内容(一般只用于文本操作) Ctrl+Y 重做刚才动作(一般只用于文本操作) Ctrl+Z 撤消刚才动作(一般只用于文本操作) Ctrl+F4 关闭当前标签(窗口) Ctrl+F5 刷新当前页面 Ctrl+F6 按页面打开的先后时间顺序向前切换标签(窗口) Ctrl+F11 隐藏或显示菜单栏 Ctrl+Tab 以小菜单方式向下切换标签(窗口) Ctrl+Enter 域名自动完成http://www.XXX.com(内容可更改,Maxthon选项→地址栏→常规)/另:当输入焦点在搜索栏中时,为高亮关键字 Ctrl+拖曳 保存该链接的地址或已选中的文本或指定的图片到一个文件夹中(保存目录可更改,Maxthon选项→保存) Ctrl+小键盘'+' 当前页面放大20% Ctrl+小键盘'-' 当前页面缩小20% Ctrl+小键盘'*' 恢复当前页面的缩放为原始大小 Ctrl+Alt+S 自动保存当前页面所有内容到指定文件夹(保存路径可更改,Maxthon选项→保存) Ctrl+Shift+小键盘'+' 所有页面放大20% Ctrl+Shift+小键盘'-' 所有页面缩小20% Ctrl+Shift+F 输入焦点移到搜索栏 Ctrl+Shift+G 关闭“简易收集”面板 Ctrl+Shift+H 打开并激活到你设置的主页 Ctrl+Shift+N 在新窗口中打开剪贴板中的地址,如果剪贴板中为文字,则调用搜索引擎搜索该文字(搜索引擎可选择,Maxthon选项→搜索) Ctrl+Shift+S 打开“保存网页”面板(可以将当前页面所有内容保存下来,等同于Ctrl+S)  Ctrl+Shift+W 关闭除锁定标签外的全部标签(窗口) Ctrl+Shift+F6 按页面打开的先后时间顺序向后切换标签(窗口) Ctrl+Shift+Tab 以小菜单方式向上切换标签(窗口) Ctrl+Shift+Enter 域名自动完成http://www.XXX.com.cn(内容可更改,Maxthon选项→地址栏→常规) Alt+1 保存当前表单 Alt+2 保存为通用表单 Alt+A 展开收藏夹列表 资源管理器 END显示当前窗口的底端 HOME显示当前窗口的顶端 NUMLOCK+数字键盘的减号(-)折叠所选的文件夹 NUMLOCK+数字键盘的加号(+)显示所选文件夹的内容 NUMLOCK+数字键盘的星号(*)显示所选文件夹的所有子文件夹 向左键当前所选项处于展开状态时折叠该项,或选定其父文件夹 向右键当前所选项处于折叠状态时展开该项,或选定第一个子文件夹 自然键盘 【窗口】显示或隐藏“开始”菜单 【窗口】+F1帮助 【窗口】+D显示桌面 【窗口】+R打开“运行” 【窗口】+E打开“我的电脑” 【窗口】+F搜索文件或文件夹 【窗口】+U打开“工具管理器” 【窗口】+BREAK显示“系统属性” 【窗口】+TAB在打开的项目之间切换 辅助功能 按右边的SHIFT键八秒钟切换筛选键的开和关 按SHIFT五次切换粘滞键的开和关 按NUMLOCK五秒钟切换切换键的开和关 左边的ALT+左边的SHIFT+NUMLOCK切换鼠标键的开和关 左边的ALT+左边的SHIFT+PRINTSCREEN切换高对比度的开和关 运行 按“开始”-“运行”,或按WIN键+R,在『运行』窗口中输入: (按英文字符顺序排列) %temp%---------打开临时文件夹 .--------------C:\DocumentsandSettings\用户名所在文件夹 ..-------------C:\DocumentsandSettings ...------------我的电脑 \--------------C盘 appwize.cpl----添加、删除程序 access.cpl-----辅助功能选项 Accwiz---------辅助功能向导 cmd------------CMD命令提示符 command--------CMD命令提示符 chkdsk.exe-----Chkdsk磁盘检查 certmgr.msc----证书管理实用程序 calc-----------启动计算器 charmap--------启动字符映射表 cintsetp-------仓颉拼音输入法 cliconfg-------SQLSERVER客户端网络实用程序 clipbrd--------剪贴板查看器 control--------打开控制面板 conf-----------启动netmeeting compmgmt.msc---计算机管理 cleanmgr-------垃圾整理 ciadv.msc------索引服务程序 dcomcnfg-------打开系统组件服务 ddeshare-------打开DDE共享设置 dxdiag---------检查DirectX信息 drwtsn32-------系统医生 devmgmt.msc----设备管理器 desk.cpl-------显示属性 dfrg.msc-------磁盘碎片整理程序 diskmgmt.msc---磁盘管理实用程序 dvdplay--------DVD播放器 eventvwr-------事件查看器 eudcedit-------造字程序 explorer-------打开资源管理器 fsmgmt.msc-----共享文件夹管理器 firewall.cpl---WINDOWS防火墙 gpedit.msc-----组策略 hdwwiz.cpl-----添加硬件 iexpress-------木马捆绑工具,系统自带 inetcpl.cpl----INTETNET选项 intl.cpl-------区域和语言选项(输入法选项) irprops.cpl----无线链接 joy.cpl--------游戏控制器 lusrmgr.msc----本机用户和组 logoff---------注销命令 main.cpl-------鼠标 mem.exe--------显示内存使用情况 migwiz---------文件转移向导 mlcfg32.cpl----邮件 mplayer2-------简易widnowsmediaplayer mspaint--------画图板 msconfig.exe---系统配置实用程序 mstsc----------远程桌面连接 magnify--------放大镜实用程序 mmc------------打开控制台 mmsys.cpl------声音和音频设备 mobsync--------同步命令 ncpa.cpl-------网络连接 nslookup-------IP地址侦测器 netstartX----开始X服务 netstopX-----停止X服务 netstat-an----命令检查接口 netsetup.cpl---无线网络安装向导 notepad--------打开记事本 nslookup-------IP地址侦探器 narrator-------屏幕“讲述人” ntbackup-------系统备份和还原 ntmsmgr.msc----移动存储管理器 ntmsoprq.msc---移动存储管理员操作请求 nusrmgr.cpl----用户账户 nwc.cpl--------NetWare客户服务 osk------------打开屏幕键盘 odbcad32-------ODBC数据源管理器 odbccp32.cpl---ODBC数据源管理器 oobe/msoobe/a-检查XP是否激活 packager-------对象包装程序 perfmon.msc----计算机性能监测程序 powercfg.cpl---电源选项 progman--------程序管理器 regedit--------注册表 rsop.msc-------组策略结果集 regedt32-------注册表编辑器 regsvr32/?----调用、卸载DLL文件运行(详细请在cmd中输入regsvr32/?) sapi.cpl-------语音 services.msc---本地服务设置 syncapp--------创建一个公文包 sysedit--------系统配置编辑器 sigverif-------文件签名验证程序 sndrec32-------录音机 sndvol32-------音量控制程序 shrpubw--------共享文件夹设置工具 secpol.msc-----本地安全策略 sysdm.cpl------系统 syskey---------系统加密(一旦加密就不能解开,保护windowsxp系统的双重密码) services.msc---本地服务设置 sfc.exe--------系统文件检查器 sfc/scannow---windows文件保护 shutdown-------关机命令(详细请在cmd中输入shutdown/?) taskmgr--------任务管理器 telephon.cpl---电话和调制解调器选项 telnet---------远程连接程序 timedate.cpl---日期和时间 tourstart------xp简介(安装完成后出现的漫游xp程序) tsshutdn-------60秒倒计时关机命令 utilman--------辅助工具管理器 winver---------检查Windows版本 winmsd---------系统信息 wiaacmgr-------扫描仪和照相机向导 winchat--------XP自带局域网聊天 wmimgmt.msc----打开windows管理体系结构(WMI) wordpad--------写字板 wuaucpl.cpl----自动更新 wupdmgr--------windows更新程序 write----------写字板 wscript--------windows脚本宿主设置 wscui.cpl------安全中心 C:/windows/fonts字体 h

15,978

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧