如何使用双缓冲在窗体上绘制

双缓冲技术(C# GDI) c#如何实现防窗体闪烁的功能。大家都会想到运用双缓冲技术,那么在c#中是如何做的?1、 利用默认双缓冲(1)在应用程序中使用双缓冲的最简便的方法是使用 .NET Framework 为窗体和控件提供的默认双缓冲。通过将 DoubleBuffered 属性设置为 true。       this.DoubleBuffered=true;(2)使用 SetStyle 方法可以为 Win 阅读详情

本教程与“Simple Finger Drawing(v.1.1.0)”这个bada应用相关,你能在projects section找到这个应用。我将用它作为一个例子来演示用双缓冲这种最有效的方式(我的个人观点)在窗体上绘制。

双缓冲背后的思想就是你在一张不可见的位图上执行了许多绘制操作,这张位图仅仅在你准备将绘制操作在屏幕上生效时作为一个整体被复制到另一张最终可见的位图上。这种方法节省了很多绘图资源,因为 每次一小部分被绘制后,屏幕不必须立即刷新了。这在游戏和绘制操作频繁的bada应用中尤为重要。

在我们的例子中,唯一不同之处在于我们使用Canvas对象而不是位图。首先绘图板得到一个被命名为"Canvas * canvas_"的私有成员变量,我们将其作为绘制的缓存。

首先我们需要如下代码构造它:

canvas_ = new Canvas();
canvas_->Construct(GetBounds());
canvas_->SetBackgroundColor(Color::COLOR_WHITE);
canvas_->Clear();

我们将其尺寸设置为窗体的大小(通过GetBounds()),背景颜色设置为白色,再以该背景色清除画布。然后编写由touch事件调用的绘制函数:

inline void
DrawingBoardForm::DrawBrush(const Osp::Ui::Control & source,
 const Osp::Graphics::Point& currentPosition)
{
 int radius = brush_->size;
 int x = currentPosition.x-radius;
 int y = currentPosition.y-radius;

 canvas_->FillEllipse(brush_->color.GetRGB32(),
 Rectangle(x, y,radius*2,radius*2));

 this->RequestRedraw(true);
}

我们只需在画布缓存上绘制,当所有绘制操作完成时,通过"RequestRedraw(true)"请求一次对窗体的异步重绘。请注意这个例子中的绘制操作是十分简单的。在一个复杂的游戏中,重绘之前你将执行上百次绘制操作。传递给"RequestRedraw()"的布尔变量告诉窗体在绘制后是否应自动调用"Show()"。

最后,我们重写这个窗体的"OnDraw()"函数:

result
DrawingBoardForm::OnDraw()
{
 Canvas* pCanvas = GetCanvasN();

 if (pCanvas)
 {
 pCanvas->Copy(Point(GetClientAreaBounds().x, GetClientAreaBounds().y),*canvas_, GetClientAreaBounds());
 delete pCanvas;
 }

 // Do not call Show(). It will be called automatically after OnDraw() callback.
 return E_SUCCESS;
}

我们只是将缓存画布的内容复制到窗体的画布。窗体会以新内容被重绘和显示。很简单吧?微笑

与刚开始学习bada时创建的早期版本相比,这次事情进行得多么顺利,我感到很惊讶大笑

好吧,我们都是bada初学者!

原文链接:http://www.badadev.com/how-to-use-double-buffering-to-draw-on-a-form/

C# 完美解决窗体切换闪屏问题 完美解决窗体切换闪屏问题 将以下代码块加在父窗体中的任意位置 protected override CreateParams CreateParams { get { CreateParams cp = base.CreateParams; cp.ExStyle |= 0x02000000; return cp; } } 原理很简单,引用以下原话: A form that has a lot of... 阅读详情

相关推荐

C#双缓冲技术实例详解

本文实例分析了C#双缓冲技术。分享给大家供大家参考,具体如下: 双缓冲解决闪烁问题。 整理: GDI+的双缓冲问题 一直以来的误区:.net1.1 和 .net 2.0 在处理控件双缓冲上是有区别的。 .net 1.1 中,使用:this.SetStyle(ControlStyles.DoubleBuffer, true); .net 2.0中,使用:this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true); 导致画面闪烁的关键原因分析: 一、绘制窗口由于大小位置状态改变进行重绘操作时 绘图窗口内容或大小每改变一次,都要调用Paint事

WinFrom对子窗体进行缓冲重绘

在窗体后台加入以下代码 /// <summary> /// 对窗体及其所有子控件进行双重缓冲 /// </summary> protected override CreateParams CreateParams { get { ...

191

vc mfc listctrl使用虚拟列表 虚拟列表用法

note 虚拟列表可有效加载大量数据 需要处理listctrl的 LVN_GETDISPINFO 消息 使用虚拟列表 不能 使用 insert的方法插入数据,而是告诉listctrl 当前要显示多少行 使用SetItemCount函数告诉listctrl当前显示多少行 使用虚拟列表需要自己维护数据源 使用 添加list ctrl 控件 将其Owner Data 属性 设置为 True 添加...

知其所以然 398

解决winform窗体控件多,加载慢、卡顿的问题

protected override CreateParams CreateParams { get { CreateParams cp = base.CreateParams; cp.ExStyle |= 0x02000000; // 用双缓冲绘制窗口的所有子控件 return cp;...

weixin_42288432的博客 1万+

Cadence Allegro新手避坑:从原理图到PCB,解决‘netrev.lst does not exist’的完整流程

本文详细介绍了Cadence Allegro从原理图设计到PCB导入网表的完整流程,特别针对新手常见的'netrev.lst does not exist'错误提供了系统解决方案。内容包括环境准备、原理图设计规范、网表生成与导入技巧,以及设计数据管理最佳实践,帮助工程师高效完成PCB设计任务。

weixin_42685438的博客 487

实战经验:Sensor Bringup中那些坑我都帮你踩过了(避坑指南)

本文是一份详尽的Sensor Bringup实战避坑指南,总结了从I2C通信、MCLK时钟、电源管理到图像异常等关键环节的常见问题与排查方法。文章提供了系统化的调试工作流,强调先硬件后软件的排查原则,旨在帮助硬件工程师快速定位并解决Sensor启动过程中的难题,提升开发效率。

weixin_29212429的博客 574

C#解决动态显示控件闪烁,使Windows Forms启用双缓冲于所有窗体以及其子控件就不闪了。

public Form1() { InitializeComponent(); //C#解决界面闪烁,窗体构造函数中加入以下3行,开启双缓冲就不闪了。 SetStyle(ControlStyles.UserPaint, true); SetStyle(ControlStyles.AllPaintingInWmPaint, true); // 禁止擦除背景. ...

chenhao0568的专栏 710

Synopsys工具链实战:如何用VCS、DC、ICC和Calibre跑通你的第一个数字IC设计项目?

本文详细介绍了如何使用Synopsys工具链(VCS、Design Compiler、ICC和Calibre)完成数字IC设计项目,从RTL代码到GDSII版图的全流程。涵盖环境配置、RTL设计验证、逻辑综合、物理实现及签核验证等关键步骤,帮助工程师掌握高效的数字IC设计流程。

weixin_42525005的博客 196

浅谈C#中的双缓冲

在编程当中,或多或少会接触到图像编程,对于图像编程来说窗口闪烁是个常见的问题,当窗口有大量的复杂的图元数据需要重绘,或者拥有自定义控件中的窗口闪烁问题更是显而易见的。出现闪烁的原因有很多种,大部分原因主要是因为触发WM_PAINT消息时窗体进行了重绘操作,此过程先是用窗体的背景色擦除窗口表面,再把窗体的图像绘制上去,但是如果这2个操作不在同一时间段完成的话,就会先看到背景色(大部分为白色)接着才看

曹江波的博客 3万+

【目标检测】yoloV5算法详解

一、与yoloV4相比,yoloV5的改进 输入端:在模型训练阶段,使用了Mosaic数据增强、自适应锚框计算、自适应图片缩放 基准网络:使用了FOCUS结构和CSP结构 Neck网络:在Backbone和最后的Head输出层之间插入FPN_PAN结构 Head输出层:训练时的损失函数GIOU_Loss,预测筛选框的DIOU_nns 二、yoloV5结构框架 CBL:CBL模块是由Conv+BN+Leaky_relu激活函数组成 Res unit:借鉴ResNet中的残差结构,用来构建深层网络,CBM是

qq_40373651的博客 2万+

Flow Matching03-01:微分方程【微分方程(描述变化规律的方程):包含未知函数和它的导数的方程】【公式解(精确)、数值解(逼近)】

好的,我将从数学角度详细解释Flow Matching,从高中生能理解的基础知识开始,逐步深入到高级概念。

u013250861的博客 219

C# WinForm页面切换导致闪烁的解决方法

将此代码写在要解决闪烁问题的父窗体中: protected override CreateParams CreateParams { get { CreateParams cp = base.CreateParams; //用双缓冲从下到上绘制窗口的所有子孙(WinXP以上) ...

jhjsxsy的专栏 1266

MATLAB从入门到精通-APP调用simulink中的参数,并且修改,将结果返回到APP中

本次案例为以下微分方程: 其中方程的初始值为: Step1:搭建simulink文件,如下图所示: 初始值配置在积分模块中,如下图所示: Step2:制作app 操作视频: ,时长01:11 代码: 本文包括APP如何回调simulik中d的参数,以及把simulink中的仿真结果输出到APP中的绘图界面中。 核心代码如下: ...

wenyusuran的专栏 3042

c# 窗体双缓冲机制

以下是msdn的说明: 双缓冲使用内存缓冲区来解决由多重绘制操作造成的闪烁问题。 当启用双缓冲时,所有绘制操作首先呈现到内存缓冲区,而不是屏幕上的绘图图面。 所有绘制操作完成后,内存缓冲区直接复制到与其关联的绘图图面。 因为只在屏幕上执行一项图形操作,所以消除了与复杂绘图操作关联的图形闪烁。对于大多数应用程序而言,由 .NET Framework 提供的默认双缓冲将提供最佳结果。 默认情况下

yal179的专栏 2103

Dify搭建AI测试用例生成器

1、获取产品需求文档2、解读、分析、挖掘需求点,提炼为测试点3、依据测试点,生成详细的测试用例4、输出测试用例1、打开 Dify 控制台,依次点击【工作室】-【ChatFlow】-【创建空白应用】。

十二测试录 1371

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

C#使用BufferedGraphics实现GDI+双缓冲绘图 转

使用双缓冲的图形可以减少或消除重绘显示图面时产生的闪烁。使用双缓冲时,更新的图形首先被绘制到内存的缓冲区中,然后,此缓冲区的内容被迅速写入某些或所有显示的图面中。显示图形的重写相对简短,这通常可以减少或消除有时在更新图形时出现的闪烁。 使用C# GDI+绘图,实现双缓冲绘图有几种方法,在这篇文章中,将介绍其中的一种——使用BufferedGraphics实现GDI+双缓冲绘图。 ...

weixin_34290631的博客 643

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

C# Winfrom窗体双缓冲,解决dataGridView卡顿的问题

在窗体的构造函数写下如下代码: public FrmSearch() { //设置窗体的双缓冲 this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw | ControlStyles.AllPaintingInWmP...

weixin_30256901的博客 3732

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

解决WinForm卡顿,加载慢、拖拽不灵活的问题

把下面这段代码放到需要解决问题的窗体中 protected override CreateParams CreateParams { get { CreateParams cp = base.CreateParams; cp.ExStyle |= 0x02000000; // 用双缓冲绘制窗口的所有子控件 return cp; ...

AI浩 7223

使用双缓冲技术解决winform窗体控件卡顿(dataGridView加载数据缓慢)

使用双缓冲技术可以解决winform窗体加载缓慢、卡顿

Java领域 2万+

.net WINFORM的GDI双缓冲的实现

有时候在窗体中执行不断的GDI+操作的时候会出现闪速的状况,除了修改窗体的参数,更应该解决刷新本身的问题,双缓冲可能就是这样来的。 方法1: 用GDI绘制在位图上,然后再重新生成位图 Bitmap bt = new Bitmap(510, 510); Graphics g = Graphics.FromImage(bt); g.DrawEllipse(Pe...

weixin_30471561的博客 191

学习QT之双缓冲机制

所谓双缓冲机制,是指在绘制控件时,首先将要绘制的内容绘制在一个图片中,再将图片一次性绘制到控件上。在早期的Qt版本中,若直接在控件上进行绘制工作,则在控件重绘时会产生闪烁的现象,控件重绘频繁时,闪烁尤为明显。双缓冲机制可以有效地消除这种闪烁现象。自Qt 5版本之后,​​QWidget​​控件已经能够自动处理闪烁的问题。因此,在控件上直接绘图时,不用再操心显示的闪烁问题,但双缓冲机制在很多场合仍然有其用武之地。

hw5230的博客 663

雙緩沖技術(C# GDI)

http://blog.youkuaiyun.com/gisfarmer/article/details/4366707 c#如何實現防窗體閃爍的功能。大家都會想到運用雙緩沖技術,那麼在c#中是如何做的? 1、 利用默認雙緩沖 (1)在應用程序中使用雙緩沖的最簡便的方法是使用 .NET Framework 為窗體和控件提供的默認雙緩沖。通過將 DoubleBuffered 屬性設置為 t

I am Rocky 1322

C# 实现颜色渐变窗体控件

1.建议设置窗体为双缓冲绘图,可有效避免界面刷时引起的闪烁 this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true); 2、代码实现 private Color Color1 = Color.Gray; //起始颜色 private Color Color2 = Color.White ; //目标颜色 private float changeAng...

muyangjun的专栏 671

C# 解决窗体闪烁

C# 解决窗体闪烁 在Windows窗体上造成“闪烁”的窗体上有很多控制。造成这种闪烁的原因有两个:1.当控件需要被绘制时,Windows发送一个控件两个消息。第一个(WM_ERASEBKGND)导致背景被绘制(OnPaintBackground),第二个导致前景被绘(WM_PAINT,射击OnPaint)。首先看到背景,然后当绘图缓慢时前景变得明...

weixin_30265103的博客 276

利用GDI+的双缓冲技术来提高绘图效率

专栏作品利用GDI+的双缓冲技术来提高绘图效率卢彦 前言进入.NET时代,Windows的绘图技术也从GDI升级到了GDI+,从名字就能知道GDI+是对以前传统GDI绘图技术的一次升级,不过在微软几乎把所有的新技术都冠之.NET的情况下,GDI+竟然不叫做GDI.NET,还真让我感到有点意外了。 :)GDI+在一种与设备无关的环境下提供了一套统一的绘图编程模型,极大

5037

C# 显示窗体显示是闪烁的问题

一般是在窗体加载大背景图后,页面控件加载的时候会出现闪现问题。 经过长时间寻找发现神代码,直接加载到页面对应的类文件下即可。 protected override CreateParams CreateParams { get { CreateParams cp = base.CreateParams; cp.ExStyle |= 0x02000000; ret

记录知识经验的空间 1841
上一篇: 两个API函数ShowAndWait、SetFocus的总结
下一篇: Chapter 0: Getting started
Choes
博客等级 码龄17年 8粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值