首页 > 其他分享 >使用双缓冲技术解决winform窗体控件卡顿(dataGridView加载数据缓慢)

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

时间:2023-03-20 10:35:33浏览次数:46  
标签:控件 offscreen 缓冲 dataGridView 窗体 内存 图像 缓冲区


背景:在做C/S项目中,做好的窗体出现了页面加载控件缓慢,放大、缩小窗体之后,窗体加载卡顿,以及数据渲染缓慢。

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

可以利用双缓冲技术去解决这个问题。那么什么是双缓冲?

百度介绍:我们看电视时,看到的屏幕称为OSD层,也就是说,只有在OSD层上显示图像我们才能看到。现在,我需要创建一个虚拟的、看不见但是可以在上面画图(比如说画点、线)的OSD层,我称之为offscreen(后台缓冲区)。这个offscreen存在于内存中,我们在上面画图,这个offscreen上面的东西可以显示在OSD层上,需要一个创建这个offscreen的函数,返回这个offscreen的句柄(整型​​指针​​​)、宽度、高度、指向新建offscreen​​数据缓冲区​​​的指针,该缓冲区是一个在函数外创建的offscreen的数据缓冲区,大小是offscreen的高度*宽度*每个像素点数据的大小。闪烁是图形编程的一个常见问题。需要多重复杂绘制操作的图形操作会导致呈现的图像闪烁或具有其他不可接受的外观。双缓冲的使用解决这些问题。双缓冲使用内存缓冲区来解决由多重绘制操作造成的闪烁问题。当启用双缓冲时,所有绘制操作首先呈现到内存缓冲区,而不是屏幕上的绘图图面。所有绘制操作完成后,内存缓冲区直接复制到与其关联的绘图图面。因为在​​屏幕​​上只执行一个图形操作,所以消除了由复杂绘制操作造成的图像闪烁。

总而言之:在计算机中,动画被视为一种变化的图像序列,由一帧一帧的动态图像组成,这些图像随着时间的改变而改变,后一帧图像是对前一帧图像所作的修改。

在单缓冲动画中,图形直接绘制在显示缓冲区,如果显示后一帧图像,必须擦除屏幕,所以在制作过程中需要不断擦除屏幕,这也是屏幕闪烁(窗体加载缓慢)的原因。双缓冲动画有两个缓冲区,除了有显示缓冲区外,还有内存缓冲区,在制作过程中首先把图形绘制在内存缓冲区中,然后讲内存缓冲区中的图像一次性拷贝到心事缓存区,显示缓冲区只是作为内存缓冲区的一个映像。

举例:

投影仪和白板。但缓冲动画:在使用白板的时候,如果写满了,需要写下一页,那么我只能把白板上的内容擦除掉,再去写内容。双缓冲动画:投影仪的时候是需要需要换内容,我直需要把投影仪中的内容进行修改即可,避免擦除操作。

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

具体方法(代码展示)

1、 C# winform窗体卡顿的解决办法

哪个窗体需要修改页面卡顿,加入此方法

protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;

cp.ExStyle |= 0x02000000;

return cp;
}

}

该方法是可以解决页面上所有控件加载慢的方法。

在上面的代码中,有用到CreateParams 类,它是具体解决卡顿、闪屏的问题。查阅资料:窗体和控件的属性CreateParams,通过它你能够很方便的控制窗体或控件诸如边框、最大化、最小化关闭,按钮的隐藏、窗体的模式化,弹窗模式等的一些特性

2、那么针对dataGridView加载数据慢,不流畅的现象也可以用以下方法。根源上也是利用了双缓冲技术。

需要在窗体所对应的构造构造函数中写入以下代码,控制DataGridView加载数据延迟的问题。

this.SetStyle(ControlStyles.OptimizedDoubleBuffer //双缓冲
| ControlStyles.ResizeRedraw
| ControlStyles.AllPaintingInWmPaint, //不擦除背景,减少闪烁
true);
this.UpdateStyles();

//利用反射设置DataGridView的双缓冲
Type dgvType = this.dgvwCustomerManagement.GetType();
PropertyInfo pi = dgvType.GetProperty("DoubleBuffered",
BindingFlags.Instance | BindingFlags.NonPublic);
pi.SetValue(this.dgvwCustomerManagement, true, null);

标签:控件,offscreen,缓冲,dataGridView,窗体,内存,图像,缓冲区
From: https://blog.51cto.com/u_15902978/6132081

相关文章

  • Android控件TextProgressBar进度条上显文字
    Android系统的进度条控件默认的设计的不是很周全,比如没有包含文字的显示,那么如何在Android进度条控件上显示文字呢?来自Google内部的代码来了解下,主......
  • web自动化-js处理日历控件
    一、基础知识:  """js处理日历控件利用js去掉readonly属性,然后直接输入时间--利用js代码获取当前元素--设置readonly这个属性值为false(或者删除readonly属性)"""......
  • winform DataGridView数据列表-----2
     上一篇对Data'gridView做了简单的封装,基本能满足正常开发了,后来我发现一个单元中同时会又左边图标右边文字的情况,这次就把这个也加上。所以我自定义歌一个组件。 自......
  • winform DataGridView数据列表-----1
        winform中的列表展示一般是ListView控件和DataGridView控件。这次就简单的介绍一下DataGridView,不得不说winform的列表展示,如果自己不去润色和扩展,原始的是真......
  • sencha-touch2.0控件nestlist的简单用法
    通过nestlist可以自定义一个有标题到内容的一个组合布局如图<font><font>Ext.create(的“Ext.tab.Panel”,{</font></font><font></font><font><font>全屏:真实,<......
  • SerialPort控件的详细用法
    SerialPort控件的详细用法属性如下:BaudRate:波特率DataBits:数据位Parity:奇偶校验位PortName:端口号StopBits:停止位ByteToRead:获取输入缓冲区的IsOpen:获取是否开启串......
  • 界面控件DevExpress WinForms的数据网格,让业务数据管理更轻松!
    DevExpressWinForms控件的DataGrid组件是一个性能优异的编辑/数据整型组件,附带了数十个高影响力的功能,用户可以轻松地管理信息并根据业务需求来展示数据信息。PS:DevExpr......
  • android studio之常用基本控件的使用
    转自:(7条消息)androidstudio之常用基本控件的使用_androidstudio控件栏_PPYY3344的博客-CSDN博客在Android开发中,需要使用的控件很多,除了TextView、Button、EditText......
  • wpf自定义控件库(二)——伪3D按钮
    1、以学习wpf为目的,同时也为了增加控件代码的复用性,开始建立自己的自定义控件库;2、目前主要是根据项目需求去增加,完善控件库。希望之后能一步步扩展更多更丰富的控件;3、......
  • pageOffice控件实现在线编辑Word 只能加批注的功能
    OA办公中,业务需要编辑打开word文档后文档的正文不能改变,只能对文档进行加批注的操作怎么实现编辑打开word文档后文档的正文不能改变,只能对文档进行加批注的操作呢?#1、......