所有者绘制的进度条中的动画“发光”(ListView/DataGridView)

2023-11-24

我注意到 .NET 2.0 (Winforms) 中的沼泽标准 ProgressBar 在 Vista 中确实显示为精美的动画发光条;但是,使用 ProgressBarRenderer(通常在尝试在所有者绘制的列表视图、网格视图或其他此类控件中绘制进度条时必须这样做)只能提供视觉样式,而没有漂亮的动画。

我想期望这会神奇地工作是愚蠢的 - 我想 Vista 中的本机控件必须具有某种嵌入式计时器或线程,而在绘制静态图像时显然不存在这些计时器或线程。我确实看到,如果您连续多次重绘 ProgressBar 控件(使用 DrawToBitmap),您实际上可以看到动画发光的不同阶段,因此我尝试使用计时器来自动重绘,但有些事情不太正确外观,而且它比实际的 ProgressBar 消耗更多的 CPU 时间。

这似乎给我留下了两个不合标准的选择: a) 使用 ProgressBarRenderer 并最终得到 Vista“外观”,但没有动画;或者 b) 使用计时器不断地将多个进度条重绘为位图,并浪费 CPU 周期来使其看起来更好,但仍然不完美。

我想知道是否有人有在自己绘制的控件中嵌入进度条的经验,并且可能知道比上面两个选项更好的方法 - 可以准确地再现发光/闪烁而不依赖计时器和/或锤击 CPU。


我必须表演一些非常疯狂的特技才能完成这项工作。不幸的是,MSFT 没有更新 VisualStyleElement.ProgressBar 类来添加 Vista 添加的部分。并且构造函数是私有的。我必须猜测一下制作动画的部分。我已经非常接近这段代码了,它应该给你一些可以尝试的东西:

using System;
using System.Drawing;
using System.Windows.Forms;
using System.Windows.Forms.VisualStyles;
using System.Reflection;

namespace WindowsFormsApplication1 {
  public partial class Form1 : Form {
    VisualStyleElement pulseOverlay;
    VisualStyleElement moveOverlay;
    VisualStyleRenderer pulseRenderer;
    VisualStyleRenderer moveRenderer;
    Timer animator = new Timer();
    public Form1() {
      InitializeComponent();
      ConstructorInfo ci = typeof(VisualStyleElement).GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance,
        null, new Type[] { typeof(string), typeof(int), typeof(int) }, null);
      pulseOverlay = (VisualStyleElement)ci.Invoke(new object[] { "PROGRESS", 7, 0 });
      moveOverlay = (VisualStyleElement)ci.Invoke(new object[] { "PROGRESS", 8, 0 });
      pulseRenderer = new VisualStyleRenderer(pulseOverlay);
      moveRenderer = new VisualStyleRenderer(moveOverlay);
      animator.Interval = 20;
      animator.Tick += new EventHandler(animator_Tick);
      animator.Enabled = true;
      this.DoubleBuffered = true;
    }
    void animator_Tick(object sender, EventArgs e) {
      Invalidate();
    }

    int xpos;
    protected override void OnPaint(PaintEventArgs e) {
      Rectangle rc = new Rectangle(10, 10, 100, 20);
      ProgressBarRenderer.DrawHorizontalBar(e.Graphics, rc);
      rc = new Rectangle(10, 10, 50, 20);
      ProgressBarRenderer.DrawHorizontalChunks(e.Graphics, rc);
      xpos += 3;
      if (xpos >= 30) xpos = -150;  // Note: intentionally too far left
      rc = new Rectangle(xpos, 10, 50, 20);
      pulseRenderer.DrawBackground(e.Graphics, rc);
      moveRenderer.DrawBackground(e.Graphics, rc);
    }
  }

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

所有者绘制的进度条中的动画“发光”(ListView/DataGridView) 的相关文章

随机推荐

  • C++编译器会优化掉未使用的返回值吗?

    如果我有一个返回对象的函数 但调用者从未使用此返回值 编译器会优化掉副本吗 可能是总是 有时 从不的答案 基本示例 ReturnValue MyClass FunctionThatAltersMembersAndNeverFails Do
  • 使用文本框和自定义词典进行拼写会减慢我在 C# WPF 中的应用程序的速度

    我在 WinForm 应用程序中使用 WPF 文本框进行拼写检查 每次创建一个文件时 我都会将相同的文件作为 CustomDictionary 加载 直到最近一切都很好 现在 它们需要很长时间才能加载 最多一秒钟 有些表格有 30 个或更多
  • 如何强制 Facebook JS-SDK 渲染动态添加的小部件?

    应用程序内的内容正在使用 XHR 进行更新 这涉及到更改评论框的 URL div class fb comments div 页面完全加载后创建新的 Facebook 小部件占位符时 如何请求 Facebook JS SDK 在页面上呈现新
  • 如何使用最小起订量模拟控制器上下文

    我正在尝试最小起订量框架 但现在我遇到了障碍 以下单元测试失败 因为 ViewName 属性的实际值是空字符串 有人能指出我正确的方向吗 为什么这没有通过测试 TestMethod public void Can Navigate To A
  • 在 xUnit.net 中的所有测试之前和之后运行代码一次

    TL DR 我正在寻找 xUnit 的 MSTest 等效项AssemblyInitialize 又名我喜欢的唯一功能 具体来说 我正在寻找它 因为我有一些硒烟雾测试 我希望能够在没有其他依赖项的情况下运行这些测试 我有一个 Fixture
  • Oracle 存储过程、SYS_REFCURSOR 和 NHibernate

    我正在连接一个旧版 Oracle 10 2g 数据库 我想使用 NHibernate 2 0 1 从存储过程返回对象 相关存储过程使用 SYS REFCURSOR 返回结果 根据文档这应该是可行的 但我找到了few posts互联网上另有建
  • 我应该使用什么 JavaScript 库来解析 URL 参数?

    如何解析 JavaScript 中的 URL 参数 这些参数我通常会称为 GET 参数或 CGI 参数 但在这种情况下 页面基本上是提交给自身 而不是服务器 因此没有 GET 请求 也绝对没有 CGI 程序 我在网上看到了许多可以复制的例程
  • Angular 2 http 服务。获取详细的错误信息

    对离线服务器执行 Angular2 http 调用并不会在我在 Observable 的 catch error 运算符或订阅错误委托中获取的 错误响应 对象中提供太多信息 它们实际上都共享相同的信息 但正如您在控制台的屏幕截图中看到的那样
  • 如何在 Windows 应用商店应用程序中使用 C# 计算大文件的哈希值(MD5 或 SHA)

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 PROBLEM 如果您尝试在 Windows 8 Metro 应用程序中使用 HashD
  • 异步函数返回 Promise { }?

    我有以下异步函数 async function readFile let content await new Promise resolve reject gt fs readFile file txt function err conte
  • cv2.videoCapture.release() 的含义是什么?

    我正在使用树莓派来捕获视频的前 20 帧 现在这更多的是一个概念问题 但是在浏览有关 videoCapture 的 openCV 文档时 他们强调了在此代码中释放捕获的重要性 如其网站上发布的 import numpy as np impo
  • 如何在 ASP.NET Core 2.2 中使用来自不同托管项目的共享 SignalR Hub

    我正在处理一个使用 ASP NET Core 2 2 构建的项目 主要解决方案包含多个项目 其中包括API Web和其他类库 我们使用 SignalR 来显示 API 项目和 Web 项目之间的共享消息 通知 例如 从 API 添加新员工记
  • SMLoginItemSetEnabled 有时会默默地无法启动沙盒 UI 帮助程序

    我有一个沙盒应用程序 其中包含一个呈现一些 UI 的帮助程序 作为全屏窗口 但也可以是状态项或类似项 这在大多数情况下都有效 但有时却并非如此 它只是默默地无法启动助手 由于助手有 UI 我使用SMLoginItemSetEnabled加载
  • Google Cloud Vision API:“请求的身份验证范围不足。”

    你好 我正在尝试使用谷歌的云视觉 API 特别是这个例子 https cloud google com vision docs label tutorial label tutorial 1 我按照这个教程进行操作 https cloud
  • 在 Three.js 中创建 2 点之间的样条曲线

    我正在尝试使用 Three js 将点与样条线链接起来 以实现我想要制作的可视化效果 据我所知 我将点添加到数组中 将其传递给 THREE SplineCurve3 逐步遍历样条线点以获取几何坐标并进行渲染 如果我只将起点 终点添加到数组中
  • Html.HiddenFor 是做什么的?

    虽然我已经阅读了 Html HiddenFor 的文档 但我还没有掌握它的用途 有人可以解释它的用途并举一个简短的例子吗 这些助手应该放在代码中的哪里 它在表单上为您传递的字段 来自模型 创建隐藏输入 对于模型 视图模型中需要保留在页面上并
  • VSTS 中 Android 应用程序的 Gradle 构建在内存不足后失败

    我在 VSTS 中有一个 gradle 构建 正在构建 Android 应用程序 但它失败并出现以下错误 构建机器真的只有很少的内存吗 还是我应该更改一些设置gradle properties 例如这org gradle jvmargs设置
  • WebBrowser DocumentCompleted 事件多次触发

    我一直在研究这个东西 每个人似乎都同意解决方案是检查ReadyState直到设置为 完成 但实际上该事件有时会被触发ReadyState多次设置为 完成 我认为对于那个蹩脚的 NET WebBrowser 没有解决方案 但如果我使用底层 D
  • Java 中抛出异常

    我有一个关于在 Java 中抛出异常的问题 这似乎是我这边的一种误解 我想自己澄清一下 我一直在读到处理异常代码的两种基本方法是 1 在 try 块中使用 throw new 抛出异常 并立即在 catch 块中捕获它 所谓的 try th
  • 所有者绘制的进度条中的动画“发光”(ListView/DataGridView)

    我注意到 NET 2 0 Winforms 中的沼泽标准 ProgressBar 在 Vista 中确实显示为精美的动画发光条 但是 使用 ProgressBarRenderer 通常在尝试在所有者绘制的列表视图 网格视图或其他此类控件中绘