看了wincss的校内日志,觉得写的很不清楚...加上校内比较封闭...决定写一个详细些的放到这里.
首先,我们要做到的是,在窗口上画矩形.
鼠标按下并拖动的时候,矩形会跟着鼠标的移动变化大小;等到松开鼠标的时候,矩形就画上了.
首先想到的是在BitMap上绘画并放到PictureBox里,然后MouseMove触发重绘.但这样还要记录一个当前这次鼠标按下之前的图,然后重绘的时候需要在那个图的基础上重绘,比较麻烦,而且因为重绘次数很多,速度很慢.
有没有别的办法呢?
我们可以看一下PictureBox的Paint方法.
Paint方法在每次PictureBox需要重绘(Invalidate方法或Refresh方法被调用)的时候触发,用于重绘窗体.
BitMap不用写到Paint里就能被重绘是因为它会被自动重绘.而我们上面的那个重绘方式每次正是需要在原来图的基础上重绘.这样我们是不是可以在MouseUp之前不改变BitMap呢?
答案是肯定的,我们可以在PictureBox的Paint方法里调用e.Graphics.DrawRectangle方法进行重绘.这样重绘出来的东西会放在BitMap上面,相当于在ImageBox里的BitMap上新建了一个透明层...很神奇的.
然后等到MouseUp被触发,再将矩形绘制到BitMap里并重绘即可.
注意在Paint方法中调用了e.Graphics.DrawRectangle而不是pictureBox1.CreateGraphics().DrawRectangle,后者不可行,它画出的矩形会一闪即逝.
整个程序的代码点这里下载.
代码由wincss编写,本人做了些许更改(主要是从VS08的格式转到VS05,因为我没有08)并加了注释.在VC#2005下编译并运行测试通过.
感谢wincss对本人提供的帮助...
大概有了一个想法 和jl一起编一个有关追逐的游戏 但还不是很成熟 先不放出来了
No related posts.
2008年08月28日 at 11:25
继续沙发
2008年08月28日 at 12:00
传说中了C++++.....我还不会``
2008年08月28日 at 15:28
...
2008年08月28日 at 16:18
原来你用C#……很高效很实用……
只是我不喜欢封装 所以只用c……
PS:写email很麻烦 建议你弄成 unrequired……
2009年01月12日 at 13:42
好方法
不过Paint好象是叫事件,不是方法。。
2009年01月12日 at 18:00
@anran: 我怎么觉得叫方法也没啥大问题..
2009年11月09日 at 09:57
一直认为C#的语言架构是最优雅的,毕竟是一家公司在严格到极致的限定下作出来的,拿到一个新的类自然就能想出它应该有哪些接口。托管代码,事件机制也导致了新的软件工程和设计模式的诞生。
不过强大过度的封装也的确导致市场上诞生了一批码工,装卸工和拼接工。任何一个没有编程基础的人培训一个月就能用C#(ASP.NET)作一个信息管理系统或者网站了。
最天才和最不天才的人在同时使用这门语言。
2008年08月28日 at 17:43
你可以注册一个用户...鼓励多多注册用户...
封装多好啊