Archive for the ‘C#’ tag
如何用好C#的Paint重绘
看了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一起编一个有关追逐的游戏 但还不是很成熟 先不放出来了
2008.08.26
今天效率还是蛮高的.
开始接触C#,在bw的怂恿下写了关于这样一个物理题的小程序来熟悉它:
猎狗追狐狸,刚开始狐狸的速度方向和猎狗的速度方向垂直,而猎狗的速度方向时时刻刻指向狐狸的位置.
求猎狗和狐狸行进的轨迹.
然后瞎写了个东西模拟了一下,肯定不准啦…
然后刚开始直接在Form_Load里面画,结果最大的问题是一启动就画完了,不能看到一点一点画出来的样子.
然后查了半天,才知道有Graphics这个东西.尝试了好久语法,终于可以在form上画出来了.可是重绘的问题没有办法解决,VB有一个窗体重绘的函数,而VC#没有.
于是baidu了一下,发现PictureBox可以完成这个任务.然后改成了new Image上画线,然后扔到PictureBox里.
但是bug来了,画线竟然只画了第一条,后面就没了…
找了半天,发现PictureBox有个Refresh函数.加上这个函数,搞定.
然后就是加了try-catch,加了更改速度的方法(三个textbox),改了颜色.
被我哥bs了…意料之中.我哥希望我拿C#干一些更高级的事情…但我现在却没有这个打算…所以bs就bs吧…
感觉C#的确很像VB,很容易上手.MSDN是个好东西,只不过有时候不够详细.不知道是不是因为我的VS是express?
附程序,仅供玩玩…一点技术也没有,所以如果你抱着要bs我的心态,还是别下载了,因为我不接受除了我哥以外任何人的bs.
需要.NET Framework支持,点击这里下载Microsoft .NET Framework 3.5(zh-cn).
点击这里下载程序.