如何修复用户控件中的闪烁

2023-11-22

在我的应用程序中,我不断地从一个控件移动到另一个控件。我已经创建了没有。用户控件,但在导航过程中我的控件会闪烁。更新需要 1 或 2 秒。我尝试设置这个

SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
or
SetStyle(ControlStyles.UserPaint, true);
SetStyle(ControlStyles.AllPaintingInWmPaint, true); 
SetStyle(ControlStyles.DoubleBuffer, true);

但这没有帮助...每个控件都有相同的背景图像和不同的控件。 那么有什么办法解决呢..
Thanks.


不是双缓冲可以解决的那种闪烁。也不是 BeginUpdate 或 SuspendLayout。你有太多的控件,BackgroundImage 可以使它成为lot worse.

它在 UserControl 绘制自身时启动。它绘制背景图像,在子控件窗口所在的位置留下孔。然后,每个子控件都会收到一条消息来绘制自己,它们将用窗口内容填充该孔。当您有很多控件时,用户会在一段时间内看到这些漏洞。它们通常是白色的,在黑暗时与背景图像形成鲜明对比。或者,如果表单设置了 Opacity 或 TransparencyKey 属性,它们可以是黑色的,与任何东西形成鲜明对比。

这是 Windows 窗体的一个非常基本的限制,它与 Windows 呈现窗口的方式有关。顺便说一句,由 WPF 修复,它不使用窗口作为子控件。您想要的是对整个表单(包括子控件)进行双缓冲。这是可能的,检查我的代码这个线程的解决方案。但它有副作用,并且实际上并没有提高绘画速度。代码很简单,将其粘贴到您的表单中(而不是用户控件):

protected override CreateParams CreateParams {
  get {
    CreateParams cp = base.CreateParams;
    cp.ExStyle |= 0x02000000;  // Turn on WS_EX_COMPOSITED
    return cp;
  }
} 

您可以采取多种措施来提高绘画速度,使闪烁不再明显。首先处理背景图像。他们可以really当源图像很大并且需要缩小以适应控件时,成本高昂。将BackgroundImageLayout 属性更改为“Tile”。如果这提供了明显的加速,请返回到您的绘画程序并调整图像大小,以更好地匹配典型的控件大小。或者在 UC 的 OnResize() 方法中编写代码来创建适当大小的图像副本,这样就不必在每次控件重绘时都调整其大小。对该副本使用 Format32bppPArgb 像素格式,它的渲染速度比任何其他像素格式快约 10 倍。

接下来您可以做的就是防止孔洞太明显并且与图像形成鲜明对比。你可以turn offUC 的 WS_CLIPCHILDREN 样式标志,该标志防止 UC 在子控件所在的区域进行绘制。将此代码粘贴到 UserControl 的代码中:

protected override CreateParams CreateParams {
  get {
    var parms = base.CreateParams;
    parms.Style &= ~0x02000000;  // Turn off WS_CLIPCHILDREN
    return parms;
  }
}

子控件现在将在背景图像的顶部绘制自己。你可能仍然会看到它们一张一张地画自己,但中间丑陋的白色或黑洞将不可见。

最后但并非最不重要的一点是,减少子控件的数量始终是解决缓慢绘制问题的好方法。覆盖 UC 的 OnPaint() 事件并绘制现在在子项中显示的内容。特定的 Label 和 PictureBox 是very浪费。方便点击,但其轻量级替代方案(绘制字符串或图像)仅需要 OnPaint() 方法中的一行代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何修复用户控件中的闪烁 的相关文章

  • 单元测试验证失败

    我正在运行我的单元测试PostMyModel路线 然而 在PostMyModel 我用的是线Validate
  • 在 Java 中创建 T 的新实例

    在C 中 我们可以定义一个泛型class A
  • 删除是如何工作的? [复制]

    这个问题在这里已经有答案了 可能的重复 C 编程 free 如何知道要释放多少 https stackoverflow com questions 1518711 c programming how does free know how m
  • 在 C# 中调用 C++ 库 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有很多用 C 编写的库 我想从 C 调用这些库 但是 我遇到了很多问题 我想知道是否有书籍或指南告诉我如何做到这一点 Dll导入 htt
  • std::call_once 可重入且线程安全吗?

    std call once http en cppreference com w cpp thread call once是线程安全的 但它也是可重入的吗 我使用 VS2012 调试和发布 进行的测试表明 调用std call once从单
  • MS Office PIA“向后兼容性”

    我已经成功完成了与 MS Word 集成的 Windows 窗体应用程序 该应用程序写入 Word 模板中的合并字段 我使用 MS Word 2007 制作了该模板 但以兼容模式将其保存为 97 2003 dot 文件 由于我安装了 Off
  • 是否存在指向不同类型的指针具有不同大小的平台?

    C 标准允许指向不同类型的指针具有不同的大小 例如sizeof char sizeof int 是允许的 但是 它确实要求如果将指针转换为void 然后转换回其原始类型 它必须与其原始值进行比较 因此 从逻辑上来说 sizeof void
  • Gwan C#,如何获取HTTP标头?

    我需要它来重写 url 以了解我正在处理哪个友好的 url 用于用户代理和其他东西 EDIT public class Gwan MethodImplAttribute MethodImplOptions InternalCall exte
  • 计算另一个表达式中的 C# 表达式

    我想在另一个表达式中使用一个表达式 Expression
  • C# 开源 NMEA 解析器 [已关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找 C 开源 NMEA 解析器 嗯 我自己也不熟悉 但是一些快速搜索显示了一个代码项目 htt
  • 将接口转换为其具体实现对象,反之亦然?

    在 C 中 当我有一个接口和几个具体实现时 我可以将接口强制转换为具体类型 还是将具体类型强制转换为接口 这种情况下的规则是什么 Java 和 C 中都允许这两个方向 向下转型需要显式转型 如果对象类型不正确 可能会抛出异常 然而 向上转换
  • 如何在三个 IEnumerable 上使用 Zip [重复]

    这个问题在这里已经有答案了 可能的重复 使用 Linq 从 3 个集合创建项目 https stackoverflow com questions 5284315 create items from 3 collections using
  • 在 asp.net MVC 中使用活动目录进行身份验证

    我想使用活动目录对我的 asp net mvc 项目中的用户进行身份验证 在网上冲浪了几个小时后 我没有找到任何对我有用的东西 我已经看到了所有结果 但什么也没有 我尝试按照许多帖子的建议编辑我的 web config 如果有人可以帮助我提
  • 在 OpenGL 中渲染纹理 1 到 1

    所以我想做的是使用 OpenGL 和 C 将纹理渲染到平面上 作为显示图像的一种方式 但是我需要确保在渲染纹理时没有对纹理进行任何处理 抗锯齿 插值 平滑 模糊等 这是 OpenGL 处理渲染纹理的默认方式吗 或者是否需要设置一些标志才能禁
  • 选择查询不适用于使用Parameters.AddWithValue 的参数

    C 中的以下查询不起作用 但我看不出问题所在 string Getquery select from user tbl where emp id emp id and birthdate birthdate cmdR Parameters
  • LINQ 中的“from..where”或“FirstOrDefault”

    传统上 当我尝试从数据库中获取用户的数据时 我使用了以下方法 在某种程度上 DbUsers curUser context DbUsers FirstOrDefault x gt x u LoginName id string name c
  • INotifyPropertyChanged 和 propertyName

    我一直不确定它的含义propertyName实施时INotifyPropertyChanged 所以一般来说你实现INotifyPropertyChanged as public class Data INotifyPropertyChan
  • DataContractSerializer 事件/委托字段问题

    在我的 WPF 应用程序中 我正在使用DataContractSerializer序列化对象 我发现它无法序列化具有事件或委托声明的类型 考虑以下失败的代码 Serializable public abstract class BaseCl
  • 如何使用placement new重新初始化该字段?

    我的课程包含字段 private OrderUpdate curOrderUpdate 我一遍又一遍地使用它 经常需要重新初始化 for int i 0 i lt entries size i auto entry entries i ne
  • 使用未分配的局部变量

    我遇到了一个错误 尽管声明了变量 failturetext 和 userName 错误仍然出现 谁能帮帮我吗 Use of Unassigned local variable FailureText Use of Unassigned lo

随机推荐

  • 通过 webhook 触发 azure 管道?

    我想通过 Webhook 触发 Azure DevOps 管道 例如 我希望能够使用一些 JSON 向 Azure 上的某个端点发送 POST 然后让该端点触发要调用的管道 并向其传递 JSON 这可能吗 现在可在 Azure DevOps
  • 从符号链接获取真实路径 C#

    有谁知道如何从符号链接文件或文件夹中获取真实路径 谢谢你 大家好 经过我的研究 我找到了这个解决方案来获取符号链接的真实路径 如果您创建了符号链接并想检查该文件或文件夹的真实指针在哪里 如果有人有更好的写法请分享 DllImport ker
  • 如何为 ember.js 创建自定义适配器?

    我计划使用 ember js 但是我的 REST api 与打包的 REST 适配器并不完全一致 我想 覆盖 find 并能够将我自己的 ajax 放入其中 我不喜欢 ember findAll 在没有分页选项的情况下检索所有文档 因此与其
  • React 模式对话框的内容不可用于使用 mount() 的酶测试

    我有一个带有模式对话框的 React 组件 使用构建reactstrap 但其他人也报告了类似的问题react bootstrap和其他类型的模态组件 Enzyme 无法找到模态中的任何组件 即使它们在实际应用程序中呈现良好 最小的例子 i
  • 提高 R Rayshader 图像的分辨率

    我正在尝试使用 Rayshader 包制作图像 我很高兴能够使用如下代码创建 png 文件 library ggplot2 library rayshader example plot lt ggplot data frame x c 1
  • 如何在没有元类冲突的情况下将泛型类型与 PyQt 子类一起使用?

    我曾尝试过abc ABCMeta使用 sip 包装类型 并且当子类化时它工作得很好abc ABC class QABCMeta wrappertype ABCMeta pass class WidgetBase QWidget metacl
  • AngularJS - 在登录时存储基本身份验证

    我对此感到很头疼 我对 API 的使用还比较陌生 还没有做过任何需要身份验证的事情 我一直坚持向 API 发送 POST 请求 创建内容片段的端点是 entity node 如果我发送以下内容 我可以发送成功的 POST 请求 header
  • 将 dict 转储到 JSON 时保持顺序

    我想将数据库查询的结果序列化为 JSON 每行都有许多列 我添加到一个字典中 这些列按一定顺序排列 但是当我序列化数据时 顺序会发生变化 我尝试使用OrderedDict 但仍然看到同样的问题 如何保持列的顺序 res a i 0 b i
  • :[属性=值]的第n个子级(2n)

    我有一个包含行的列表 每一行li有一个属性data status其值可以是1 5 ul li li li li li li li li li li li li li li li li li li li li li li ul
  • 如何在 ASP.net Core 2 的 appsettings.json 中加密密码?

    我想使用 appsettings json 来存储 主密码 然后 该主密码将用于打开由这个出色的密码存储包生成的私钥 及其后续密码存储 https github com neosmart SecureStore 问题是 我想不出任何方法来加
  • R 中形状文件到光栅的转换?

    我从 worldwildlife org 下载了一个关于世界陆地生态区的形状文件 该文件可以在此处加载 http worldwildlife org publications terrescial ecoregions of the wor
  • 重新编译后 Mex 函数未更新

    我有一个简单的 mex 函数 它从库中调用另一个 C 函数 我编译源代码 mex cxx mymexfunction cpp I some include L some lib lmylib mylib 库是动态的 so 并且自身与其他一些
  • 在列表中移动项目?

    在Python中 如何将项目移动到列表中的确定索引 Use the insert列表方法 l list l insert index item 或者 您可以使用切片表示法 l index index item 如果要将列表中已有的项目移动到
  • Typescript:将函数添加到 moment.js 命名空间

    我正在尝试向 moment js 库添加额外的功能 我想添加一个函数 它本身需要在其主体中调用 moment 但我很难弄清楚这一点 我正在使用最新版本的 Typescript 和 moment js 我试图找到解决方案 但一无所获 这个解决
  • wxPython:如何找出哪个小部件具有焦点?

    我如何找出我的中的哪个小部件wx Frame有重点吗 您应该能够使用 Window 类的静态FindFocus 方法返回具有焦点的对象 api http www wxpython org docs api wx Window class h
  • 为什么C++中同时存在结构体和类?

    据我们所知 struct and class在语言中的许多地方可以互换 令人困惑的是 关键字本身不一定对应于标准中使用的语言 例如 在标准草案 N4567 class 10 中 A POD struct109 is a non union
  • 如何使 JPA OneToOne 关系变得懒惰

    在我们正在开发的这个应用程序中 我们注意到视图特别慢 我分析了视图并注意到 hibernate 执行了一个查询 即使数据库中只有两个对象需要获取 该查询也花费了 10 秒 全部OneToMany and ManyToMany关系很懒惰 所以
  • MSSQL JDBC 驱动程序在首次连接时不会连接到镜像故障转移伙伴

    我使用 C3P0 和 MS SQL JDBC 4 驱动程序在数据库消失时自动故障转移到新的数据库镜像 如果它首先连接到主数据库 则故障转移将起作用并无缝切换到镜像数据库 但是 如果应用程序启动时主体数据库已关闭 而镜像数据库可连接 使用 M
  • 从匹配正则表达式的结果中删除最后一个字符

    我正在尝试在 jmeter 测试中提取 html 的一部分 我需要从 a 中提取一部分
  • 如何修复用户控件中的闪烁

    在我的应用程序中 我不断地从一个控件移动到另一个控件 我已经创建了没有 用户控件 但在导航过程中我的控件会闪烁 更新需要 1 或 2 秒 我尝试设置这个 SetStyle ControlStyles OptimizedDoubleBuffe