SQYBI.com

Change is a part of life, and takes part in finding us who we are.

如何用好C#的Paint重绘

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

No related posts.

Author: sqybi

理工男,宅男,闵行MIT荣誉出品。

8 Comments

  1. 传说中了C++++.....我还不会``

  2. 原来你用C#……很高效很实用……

    只是我不喜欢封装 所以只用c……

    PS:写email很麻烦 建议你弄成 unrequired……

  3. 好方法
    不过Paint好象是叫事件,不是方法。。

  4. @anran: 我怎么觉得叫方法也没啥大问题..

  5. 一直认为C#的语言架构是最优雅的,毕竟是一家公司在严格到极致的限定下作出来的,拿到一个新的类自然就能想出它应该有哪些接口。托管代码,事件机制也导致了新的软件工程和设计模式的诞生。
    不过强大过度的封装也的确导致市场上诞生了一批码工,装卸工和拼接工。任何一个没有编程基础的人培训一个月就能用C#(ASP.NET)作一个信息管理系统或者网站了。
    最天才和最不天才的人在同时使用这门语言。

  6. 你可以注册一个用户...鼓励多多注册用户...
    封装多好啊

发表评论

Required fields are marked *.

*


请使用@user: comment的格式来回复一个人的评论, 或者直接点击评论后的"回复". 例如:
@sqybi: 你好!
这样sqybi将会收到一封通知邮件.