关于pictureBox控件刷新闪的问题

liang4571231 2008-08-30 10:33:14
我现在做的是一个象棋游戏,现在有一个问题就是当棋子移动时,用这个bmp.DrawImage(bitmap1, a, b)把原先在(i,j)的图片画到(a,b)处,但是我要消掉在在(i,j)处的bitmap1,所以我用了pictureBox.Refresh()函数刷新,把他以前的痕迹取消掉。
这里我只说了最关键的问题,就是把以前的痕迹取消掉。只要回答这个问题就行了,应该怎么做,不让他闪。
请说的详细点,网上有很多都说用双缓冲,但找了找都是些理论的东西,我看着就头疼。
请说的详细点,最好有代码并附有说明。
非常感谢!!!
...全文
433 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
jokdsh 2010-04-01
  • 打赏
  • 举报
回复
this.DoubleBuffered = true;
村口的大爷 2008-08-31
  • 打赏
  • 举报
回复
也可以这样啊 当需要刷新时,你就用你的棋盘背景色把它覆盖掉就可以了,
我昨天做的一个连连看就是这样做的
liang4571231 2008-08-31
  • 打赏
  • 举报
回复
再顶顶,继续请教
luluyy 2008-08-31
  • 打赏
  • 举报
回复
这样也行:你在上面放个panl 把这个panl的大小设置为 2000 1000 超过你窗体的大小就行 加上背景图片 可以解决这个问题 背景图片用你的棋盘代替 你可以试试
liang4571231 2008-08-30
  • 打赏
  • 举报
回复
有人回答我吗,忙下忙啊
liang4571231 2008-08-30
  • 打赏
  • 举报
回复
谢谢,还有其他人回到我吗?
zero8500 2008-08-30
  • 打赏
  • 举报
回复
帮顶一下
hiddkiller 2008-08-30
  • 打赏
  • 举报
回复
哦 上面的
手动实现双缓冲
1:
2:


方法一 方法二 的意思,刚才自己看了下,
很像是第一步第二步的感觉 更正一下

手动实现双缓冲
方法一:XXX
方法二: XXX
hiddkiller 2008-08-30
  • 打赏
  • 举报
回复
双缓冲...!

不用双缓冲你就试试这样的刷新
刷新用:
pictureBox1.Invalidate(Rectangle原先的位置);
pictureBox1.Invalidate(Rectangle现在的位置);
以上是重绘(刷新)部分区域;


或者全部重绘:
pictureBox1.Invalidate();


若要用双缓冲

双缓冲实现

系统双缓冲:
如果你要开双缓冲,只要把DoubleBuffered属性为true就行了;
但是此属性 访问受限制,
那就需要继承PictureBox;在里面设置 DoubleBuffered属性为true
或者 在构造方法内添加以下代码开启双缓冲;
this.SetStyle(ControlStyles.OptimizedDoubleBuffer |
ControlStyles.ResizeRedraw |
ControlStyles.AllPaintingInWmPaint | ControlStyles.DoubleBuffer, true);//开启双缓冲




手动实现双缓冲
1: 先把要绘制的图形绘制到一张图片上,在把图片一次绘制到你需要绘制的控件上;
2: 建立图形缓冲区,是什么具体也说不清楚 我理论差,大概的意思能理解;反正会用就行
在需要绘制的控件或窗体内添加以下方法,注释已经给你写了

//绘制方法,建立图形缓冲区,刷新时可调用此方法
public void DoubleDraw()
{
Graphics me = this.CreateGraphics();
Rectangle rect = this.ClientRectangle;
BufferedGraphicsContext context = BufferedGraphicsManager.Current;
BufferedGraphics bfg = context.Allocate(me, rect);
Graphics g = bfg.Graphics;
g.SmoothingMode = SmoothingMode.HighSpeed;
g.PixelOffsetMode = PixelOffsetMode.HighSpeed;
g.Clear(this.BackColor);
DrawMe(g);//这里才是绘制图形的地方
bfg.Render(me);
g.Dispose();
bfg.Dispose();
}


//重绘事件触发方法
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
DoubleDraw();//这里调用绘制方法
}
//绘制方法,此方法可以不用调用,在DoubleDraw方法内会自己调用
private void DrawMe(Graphics g);
{
//在这里绘制你需要的东东
}


经测试 以上三种方法 在同一台机器上绘制同一张图片
系统自带双缓冲 每秒35帧
手动实现双缓冲1 每秒40帧
手动实现双缓冲2 最牛 每秒74帧
而未开双缓冲 每秒12帧 我靠 难怪会闪


个人经验,没什么技术含量,小弟很菜,有错的地方希望大家指点
在Windows操作系统上,VisualBasic作为一门计算机语言,功能非常强大,而且简单易学。VisualBasic提供可视化设计工具,编程人员可利用VisualBasic提供的控件轻松的“画”出应用程序的友好界面,因此容易入门,入门以后就有能力进一步学习难度更大的编程语言。VisualBasic作为编程人员的首选程序设计语言,有如下特点: 1、VisualBasic是开发Windows应用程序的强有力的工具,使用了最先进的程序设计思想,能轻而易举的开发出符合Windows规范和风格的应用程序; 2、VisualBasic在科学计算、多媒体软件开发、网络应用等方面都有强大的功能,尤其在数据库开发方面,提供了许多控件,便于连接、查询和显示查询结果,现在很多管理软件,包括一些大型软件,都是利用VisualBasic开发的; 3、VisualBasic改变了传统的程序的机制,采用“事件驱动”方式,用户操作产生不同的事件,程序根据这些事件去分别执行不同的子程序。编程人员可以分别编写出这样一些子程序,因此使编程难度大大下降。   在VisualBasic语言中,控件是用户界面的基本要素,是进行可视化程序设计的重要基础,它不仅关系到界面是否友好,还直接关系到程序的运行速度以及整个程序的好坏。每个控件都具有它的属性、方法和事件,设计窗体就必须很好的掌握控件的属性和应用方法。控件具有很多相同的属性,如标识控件名称的Name属性、标识控件标题的Caption属性、有效属性Enable、可见属性Visible、标识控件位置和大小的Top、Left、Width、Height、属性、定义背景色的BackColor属性、定义前景色的ForeColor属性和定义字体类型的Font属性,各个控件也有其特有的一些属性。   VisualBasic中的控件分为两种,即标准控件(或内部控件)和ActiveX控件。内部控件是工具箱中的“常驻”控件,始终出现在工具箱里,而ActiveX控件是扩展名为.ocx的文件(在Windows\System文件夹里),它是根据变成需要添加到工具箱里的。   在一般情况下,工具箱里只有标准控件,为了把ActiveX控件添加到工具箱里,可按以下步骤执行: (1)在菜单里选择“工程-部件”,弹出“部件”对话框; (2)在对话框中选择“控件”选项卡,显示ActiveX控件列表; (3)在列表框中找到需要添加的控件名称,单击控件名称左侧的复选框; (4)使用同样的方法选择需要添加的其它控件; (5)单击“确定”按钮,即可将所选ActiveX控件添加到工具箱里。 窗体(FORM)的常用属性 属性 说明 (Name)窗体的名称 ActiveControl返回焦点所在的控件,该属性设计阶段不可用,运行时只读。 Appearance外观效果,取值为:0 平面1 3D(立体) AutoRedraw是否自动刷新或重画窗体上所有图形[获得或设置从绘图(graphics)方法到一个持久性位图的输出],取值为:True False BackColor背景颜色,可从弹出的调色板选择。 BorderStyle设置边界类型,取值为: 0 None(无边界框架)1 FixedSingle(窗口大小固定不变的单线框架) 2 Sizable(窗口大小可变的标准双线框架) 3 FixedDialog(窗口大小固定的对话框窗体) 4 FixedToolWindow(窗口大小固定的工具箱窗体) 5 Sizable ToolWindow(窗口大小可变的工具箱窗体) Caption窗体的标题 ClipControls决定Paint事件的graphics方法是重画整个对象,还是重画新显示的区域。取值为: True或False ControlBox是或有控制框, 取值为: True 有 False 无 DrawMode设定窗体上绘图(graphics方法),Shape,Line等控件的输出外观,有16种可选: 1 黑色 2 非或笔,设置值15的反相 3 与非笔,背景色以及画笔反相二者共有颜色的组合 4 非复制笔,设置值13的反相 5 与笔非,画笔以及显示色反相二者共有颜色的组合 6 反相,显示颜色反相 7 异或笔,画笔颜色以及显示颜色的异或 8 非与笔,设置值9的反相 9 与笔,画笔以及显示色二者共有颜色的组合 10 非异或笔,设置值7的反相 11 无操作,该设置实际上是不画图 12 或非笔,显示颜色与画笔颜色反相的组合 13 复制笔,用ForeColor属性指定的颜色,此为默认值 14 或笔非,画笔颜色与显示颜色反相的组合 15 或笔,画笔颜色与显示颜色的组合 16 白色 DrawStyle设定绘图相关方法使用的直线样式, 有7种可选: 0 实线,此为默认值 1 虚线 2 点线 3 单点划线 4 双点划线 5 无线 6 内部实线 DrawWidth设定绘图相关方法使用的直线宽度 Enabled是或把鼠标或键盘事件发送到窗体,取值为: True 可用 False 不可用 FillColor填充颜色, 可从弹出的调色板选择。 FillStyle填充样式, 有8种可选: 0 全部填充 1 透明,此为默认值 2 水平直线 3 竖直直线 4 上斜对角线 5 下斜对角线 6 十字线 7 交叉对角线 Font字型,可从弹出的对话框选择字体,大小和风格 FontTransparent输出数据是否允许重叠(获得或设置一个值,决定是否显示窗体,打印机或PictureBox上的背景文本/图形)。取值为: True或False ForeColor前景颜色,可从弹出的调色板选择。 HasDC决定是否为该控件分配了唯一的显示上下文。取值为: True或False Height窗体的高度 HelpContextID指定一个对象的缺省帮助文件上下文标识符 Icon为窗体设计图标,该图标位于标题栏的左端 KeyPrevier获得或设置是否在激活对象的上的控件的键盘事件之前,优先激活对象键盘事件。取值为: True或False Left窗体距屏幕左边界的距离 LinkMode获得或设置用于DDE会话的链接类型并激活连接,取值为: 0 None 1 Source LinkTopic获得或设置目标控件的源应用程序和主题 MaxButton窗体右上角最大化按钮是否显示,运行时只读, 取值为: True 显示 False 不显示 MDIChild是否为MDI窗体的子窗体, 取值为: True 为MDI窗体的子窗体 False 否 MinButton窗体右上角最小化按钮是否显示,运行时只读, 取值为: True 显示 False 不显示 MouseIcon MousePointer=99时,设定一个自定义的鼠标图标 MousePointer Moveable是否可以移动窗体, 取值为: True 可以移动 False 不可以移动 NegotiateMenus决定是否将对象的菜单合并到该窗体的菜单栏上。取值为: True或False OLEDropMode 获得或设置该对象是否能作为一个OLE放下目标, 取值为: 0 None(无) 1 Manual(手动) Palette 获得或设置一个图象,包含了当PaletteMode被设置为Custom时用于调色板的对象。 PaletteMode 获得或设置一个值,决定对于对象的控件使用哪个调色板。取值为: 0 Halftone 1 UseZOrder 2 Custom Picture 窗体背景图片 RightToLeft 文本书写是否自左向右。取值为: True False 自右向左 ScaleHeight 自定义坐标系的纵坐标轴的高度 ScaleLeft 自定义坐标系的左边界起点的横坐标 ScaleMode 获得或设置一个值,指示当使用graphics方法或可定位的控件时,自定义坐标系的单位, 有8种可选: 0 自定义 1 表示单位为twip(缇),每英寸=1440缇,每厘米=567缇 2 表示单位为point(磅) ,每英寸=72磅,每磅=20缇 3 表示单位为像素,是监视器或打印机分辨率的最小单位 4 表示单位为字符,每个水平单位为120缇,每个垂直单位为240缇 5 表示单位为in(英寸) 6 表示单位为mm(毫米) 7 表示单位为cm(厘米) ScaleTop 自定义坐标系的上边界起点的纵坐标 ScaleWidth 自定义坐标系的横坐标轴的宽度 ShowInTaskbar 窗体或MDI窗体是否出现在Windows95的任务栏。取值为: True 出现 False 不出现 StartUpPosition 窗体第一次出现的位置, 有4种可选: 0 没有指定初始位置 1 设定在所属项目的中央 2 设置在屏幕的中央 3 设置在屏幕的左上角 Tag 存储程序所需的附加数据 Top 窗体距屏幕顶部边界的距离 Visible 窗体是否可见, 取值为: True 该对象可见 False 该对象不可见 WhatsThisButton 获得或设置是否在一个窗体或MDI窗体的标题上显示"这是什么"按钮。取值为: True或False WhatsThisHelp 获得或设置是否在上下文相关帮助中, 使用Windows95帮助或主帮助窗口提供的"这是什么"弹出菜单。取值为: True或False Width 窗体的宽度 WindowStart 获得或设置一个窗体窗口运行时的可见状态, 取值为: 0 窗体正常状态 1 窗体最小状态 2 窗体最大状态

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧