资源简介
一款绘制很漂亮的星空小球碰撞情景软件。使用了两种绘制方法:使用双缓冲绘制和不使用双缓冲绘制。可明显对比出未使用双缓冲的屏幕很闪,使用后屏幕显示很流畅。(内附GDI+绘图屏闪原因以及解决方案)
代码片段和文件信息
/*导致画面闪烁的关键原因分析:
* 一、绘制窗口由于大小位置状态改变进行重绘操作时
* 绘图窗口内容或大小每改变一次,都要调用Paint事件进行重绘操作,该操作会使画面重新刷新一次以维持窗口正常显示。
* 刷新过程中会导致所有图元重新绘制,而各个图元的重绘操作并不会导致Paint事件发生,因此窗口的每一次刷新只会调用
* Paint事件一次。窗口刷新一次的过程中,每一个图元的重绘都会立即显示到窗口,因此整个窗口中,只要是图元所在的位置,
* 都在刷新,而刷新的时间是有差别的,闪烁现象自然会出现。
* 所以说,此时导致窗口闪烁现象的关键因素并不在于Paint事件调用的次数多少,而在于各个图元的重绘。
* 根据以上分析可知,当图元数目不多时,窗口刷新的位置也不多,窗口闪烁效果并不严重;当图元数目较多时,
* 绘图窗口进行重绘的图元数量增加,绘图窗口每一次刷新都会导致较多的图元重新绘制,窗口的较多位置都在刷新,
* 闪烁现象自然就会越来越严重。特别是图元比较大绘制时间比较长时,闪烁问题会更加严重,因为时间延迟会更长。
* 解决上述问题的关键在于:窗口刷新一次的过程中,让所有图元同时显示到窗口。
二、进行鼠标跟踪绘制操作或者对图元进行变形操作时
* 当进行鼠标跟踪绘制操作或者对图元进行变形操作时,Paint事件会频繁发生,这会使窗口的刷新次数大大增加。
* 虽然窗口刷新一次的过程中所有图元同时显示到窗口,但也会有时间延迟,因为此时窗口刷新的时间间隔远小于图元
* 每一次显示到窗口所用的时间。因此闪烁现象并不能完全消除!
* 所以说,此时导致窗口闪烁现象的关键因素在于Paint事件发生的次数多少。
* 解决此问题的关键在于:设置窗体或控件的几个关键属性。
* this.Setstyle(Controlstyles.OptimizedDoubleBuffer |
Controlstyles.ResizeRedraw |
Controlstyles.AllPaintingInWmPaint true);
*/
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Drawing2D;
using System.Media;
using System.Runtime.InteropServices;
namespace 课程设计
{
public partial class Form1 : Form
{
#region parameter
Bitmap bmp = new Bitmap(610 700);//在内存中创建一块610 * 700大小的Bitmap
Graphics g g2;//定义两画布变量
Pen mypen;//画笔,用于话中间分隔线
Brush[] p2 = new Brush[18];//定义一个笔刷数组用于绘画各个圆
Brush[] p1 = new Brush[255];//定义一个笔刷数组用于绘画星星
Point[] point = new Point[18];//定义圆的位置以及数量
Point[] starsum = new Point[250];// 定义星星位置,每侧数量为50个
int []vx = new int[18];//各个圆的移动速度
int []vy = new int[18];
System.Random rnd = new System.Random();//用于取随机数
int myValue1;
int myValue2;
int myValue3;
int myValue4;
int myValue5;// 用于画刷的随机颜色变化
Color mycolor mycolor2 mycolor4 mycolor5;//自定义颜色
#endregion
public Form1()
{
InitializeComponent();
}
private void Form1_Paint(object sender PaintEventArgs e)
{
//填充背景色为黑色
Color newC = Color.Black;
this.BackColor = newC;
}
private void Form1_Load(object sender EventArgs e)
{
//若要完全启用双缓冲则要设置窗体或者用于绘图控件的属性
//可以将 OptimizedDoubleBuffer 和 AllPaintingInWmPaint 位设置为 true。但是,
//启用双缓冲的首选方法是将该控件的 DoubleBuffered 属性设置为 true,这会产生同样的结果
//如果要设置以上属性,必须先设置UserPaint为true。
//详情可查阅MSDN里的Setstyle和Controlstyles。
this.Setstyle(Controlstyles.UserPaint | Controlstyles.AllPaintingInWmPaint
| Controlstyles.OptimizedDoubleBuffe
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2012-05-24 10:47 双缓冲 - 副本\
目录 0 2012-05-24 10:47 双缓冲 - 副本\bin\
目录 0 2012-05-24 10:47 双缓冲 - 副本\bin\Debug\
文件 61440 2011-08-16 23:12 双缓冲 - 副本\bin\Debug\AxInterop.WMPLib.dll
文件 339968 2012-05-23 20:00 双缓冲 - 副本\bin\Debug\Interop.WMPLib.dll
文件 13312 2012-05-24 10:47 双缓冲 - 副本\bin\Debug\课程设计_29030201018_冯铿宇.exe
文件 42496 2012-05-24 10:47 双缓冲 - 副本\bin\Debug\课程设计_29030201018_冯铿宇.pdb
文件 14328 2012-05-24 10:48 双缓冲 - 副本\bin\Debug\课程设计_29030201018_冯铿宇.vshost.exe
文件 490 2009-06-11 05:14 双缓冲 - 副本\bin\Debug\课程设计_29030201018_冯铿宇.vshost.exe.manifest
文件 15590 2012-05-24 10:47 双缓冲 - 副本\Form1.cs
文件 2166 2011-08-16 23:19 双缓冲 - 副本\Form1.Designer.cs
文件 6008 2011-08-16 23:19 双缓冲 - 副本\Form1.resx
目录 0 2012-05-24 10:47 双缓冲 - 副本\obj\
目录 0 2012-05-24 10:47 双缓冲 - 副本\obj\Debug\
文件 61440 2011-08-16 23:12 双缓冲 - 副本\obj\Debug\AxInterop.WMPLib.dll
文件 339968 2012-05-23 20:00 双缓冲 - 副本\obj\Debug\Interop.WMPLib.dll
文件 180 2012-05-23 20:35 双缓冲 - 副本\obj\Debug\Project.Properties.Resources.resources
目录 0 2010-12-21 11:35 双缓冲 - 副本\obj\Debug\Refactor\
目录 0 2012-05-24 10:47 双缓冲 - 副本\obj\Debug\TempPE\
文件 4608 2010-12-19 22:02 双缓冲 - 副本\obj\Debug\TempPE\Properties.Resources.Designer.cs.dll
文件 4649 2012-05-24 10:48 双缓冲 - 副本\obj\Debug\双缓冲.csproj.FileListAbsolute.txt
文件 847 2011-08-16 23:19 双缓冲 - 副本\obj\Debug\双缓冲.csproj.GenerateResource.Cache
文件 544 2012-05-23 20:00 双缓冲 - 副本\obj\Debug\双缓冲.csproj.ResolveComReference.cache
文件 2074 2010-12-16 12:45 双缓冲 - 副本\obj\Debug\课程设计.Form1 (1).txt
文件 847 2010-12-16 12:05 双缓冲 - 副本\obj\Debug\课程设计.Form1 (2).Cache
文件 180 2012-05-23 20:35 双缓冲 - 副本\obj\Debug\课程设计.Form1.resources
文件 2800 2011-08-16 23:12 双缓冲 - 副本\obj\Debug\课程设计_29030201018_冯铿宇.csproj.FileListAbsolute.txt
文件 847 2010-12-22 10:03 双缓冲 - 副本\obj\Debug\课程设计_29030201018_冯铿宇.csproj.GenerateResource.Cache
文件 544 2011-08-16 23:12 双缓冲 - 副本\obj\Debug\课程设计_29030201018_冯铿宇.csproj.ResolveComReference.cache
文件 13312 2012-05-24 10:47 双缓冲 - 副本\obj\Debug\课程设计_29030201018_冯铿宇.exe
文件 42496 2012-05-24 10:47 双缓冲 - 副本\obj\Debug\课程设计_29030201018_冯铿宇.pdb
............此处省略13个文件信息
- 上一篇:北京航空航天大学 数字图像处理 期末试题
- 下一篇:软件项目中的风险管理研究
相关资源
- 机械臂碰撞检测 八组逆解碰撞检测
- STM32F429 ADC 双缓冲DMA 中断
- [教程] 任意形状的碰撞检测 原理(附
- GDI+使用PNG图片打造异型窗口
- 小球碰撞反弹
- GDI+三维图形类
- GDI+柱状图
- 文件MD5碰撞工具
- GDI+绘图功能软件
- 碰撞检测VC实现的代码
- 用GDI+绘制极坐标图
- 椭球碰撞检测 智能检测
- MD5碰撞工具 可以指定MD5值
- 用GDI+绘制的一个强大可移动坐标,已
- IntersectionDemo.rar
- 碰撞检测 碰撞处理 游戏中的物理学
- 快速MD5 碰撞生成器
- PB+GDI截屏保存JPG图片
- OSG中碰撞检测程序
- 《实时碰撞检测算法技术》源代码
- 一个用GDI+画的仪表盘.zip
- VC GDI+ 窗口截图内存BMP转JPG压缩、JP
- GDI+高级编程 高清,完整,带书签
- 基于OpenGL的场景迷宫漫游可以碰撞检
- opengl 小球的碰撞和反弹模拟
- VC实现滚动视图双缓冲绘图
- GDI+画饼状图柱状图
- GDI+ 画图 画线 拖拽 选中 源代码
- 王小云教授的论文+md5的碰撞
- Unity3d非物理引擎模拟碰撞效果
评论
共有 条评论