作者CaMper8850 (= =)
看板C_Sharp
标题[问题] 类似小画家的缩放功能(不是图片)
时间Tue Apr 22 23:40:26 2014
各位板友晚安,
我以前是念资工的,不过C#算是自学,
最近因为帮忙做东西,需要撰写类似小画家的功能,但不太一样,
简单的说,我用windows form来实作,
把panel加到form里面,使用者可以新增/删除一些特定的textbox、label,
或者是我动态产生的image(一样动态产生picturebox来显示),
前面这三类的control会动态add至panel里面,
但是这个panel的尺寸比例是有限制的,width比height长很多,
实际上我最终的目的是把
「已经新增各种control的panel印出来」,
我的做法其实是比较偷懒的直接把panel转成bitmap,
这样的方法其实是把panel所在的萤幕区域截图,
所以这个部分无法让panel用scroll bar来显示(隐藏的部分截不到)
----------前面大概简介一下情况,以下是主要问题-----------
由於我panel尺寸的宽比高长很多,因此我想要像小画家一样,
实际画布(panel)尺寸不变,但使用者的视觉上(view?)能缩放,
请参考以下小画家画面:
http://i.imgur.com/qxqcV7o.png
这是小画家「检视」中的「放大」和「缩小」功能,
可以看到这样的缩放仅是视觉上可以把原本很大(可能大於萤幕解析度)
的画布缩小到萤幕可见范围,
滑鼠游标在画布上移动时,左下角显示的座标范围仍旧跟原始画布一样,
这个功能我找了很久都不知道该怎麽实现,找到的资料几乎都是讨论
Form、image的缩放,我如果用panel.scale()来做的话,
是直接改变实际上panel的大小(利用滑鼠移动时显示座标也看的出来),
我後来找了paint.net的source code来参考,
但是在转换版本(我用VS2010)时因为有些档案找不到而失败,
直接看程式码来trace的话,因为他很多都是自定控制项,
我追了半天还是不懂他到底是怎麽做的,
其他找到的小画家范例都没有看到这个功能,
不晓得有没有哪位前辈知道我应该往哪个方向去找线索呢?
希望各位不吝赐教,感激不尽!
--
※ 文章网址: http://webptt.com/cn.aspx?n=bbs/C_Sharp/M.1398181231.A.4DB.html
1F:→ totte:您是要看.NET元件的原始码? 推荐Red Gate .NET Reflector 04/23 01:21
2F:→ totte:或是IL Spy 另外我记得有个网站也可以看 04/23 01:21
3F:→ Litfal:坐标转换 04/24 01:11
你好,感谢你的回应,如果只是要做到panel大小不变,
但是游标移动上去时显示的不是真实座标而是缩小後的相对座标,
单纯这样的话我应该想得出来没有问题,
不过我卡关的症结点是:
小画家在我用「Ctrl+滚轮」或者「检视中的缩放」(同样功能)的时候,
发生的改变是
「画布在视觉上进行缩放,但是画布的实际大小是没有变的」
应该说我不了解的核心是这个部分,不晓得我这样说明我的情况是否能让你看得懂?
4F:→ KanoLoa:楼上解答 04/24 09:21
※ 编辑: CaMper8850 (114.42.230.139), 04/24/2014 11:43:41
5F:→ KanoLoa:所以显示的部分本来就应该单独拉出来根据显示比例重画 04/24 16:27
6F:→ KanoLoa:一样是座标转换的概念而已。 04/24 16:28
7F:推 ghostx2:Graphics.InterpolationMode 属性(System.Drawing) 参考 05/01 23:05