SQYBI.com

Always Challenge Miracle

Archive for the ‘C#’ tag

如何用好C#的Paint重绘

with 8 comments

看了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一起编一个有关追逐的游戏 但还不是很成熟 先不放出来了

Written by sqybi

八月 27th, 2008 at 11:22 下午

Posted in About Computer, [Technology]

Tagged with ,

2008.08.26

with 6 comments

今天效率还是蛮高的.

开始接触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).

点击这里下载程序.

Written by sqybi

八月 27th, 2008 at 12:03 上午

Posted in About Life, [Daily Life]

Tagged with ,