首页 > 编程语言 >winform程序背景图闪屏问题

winform程序背景图闪屏问题

时间:2023-06-04 17:45:43浏览次数:48  
标签:string pictureBox 闪屏 BackgroundImage pictureBox1 组件 fileName 背景图 winform

问题背景

在工控项目中, 往往需要加载一个背景图像用于模拟设备或图纸, 在其上需要动态放置一些标签或按钮,
通常的做法是, 使用Panel组件通过设置 BackgroundImage 属性加载背景图, 经常碰到的问题是, 窗口做resize或动态增加/删除Label时, 界面会有非常明显的屏闪现象.

public void loadPicture(string fileName)
{
    pnlContainer.BackgroundImageLayout = ImageLayout.Stretch;
    pnlContainer.BackgroundImage = null; 
    if (string.IsNullOrWhiteSpace(fileName) == false)
    {
        pnlContainer.BackgroundImage = Image.FromFile(fileName); 
    }
}

方案: 使用 pictureBox 加载背景图

在容器panel中新增一个 pictureBox 组件, 使用 pictureBox 组件来加载背景图像, pictureBox 组件本身做过优化, 能很好的解决屏闪问题. 唯一问题是 pictureBox 组件不能作为容器, 动态生成的 label 组件的 z-order 方向, 总是被 pictureBox 覆盖住, 所以在动态生成 label 后, pictureBox1.SendToBack(), 确保 pictureBox1 放置到最下层.

public void loadPicture(string fileName)
{            
    pictureBox1.BackgroundImageLayout = ImageLayout.Stretch;
    pictureBox1.BackgroundImage = null;
    if (string.IsNullOrWhiteSpace(fileName) == false)
    {
        pictureBox1.BackgroundImage = Image.FromFile(fileName);
    }
}

//在调用 newManyLabels() 之后, 再调用 pictureBox1.SendToBack(), 确保 pictureBox1 放置到最下层, 形成背景效果. 

方案: 使用 timer 降低 repaint 频次

窗口大小变化时,不立即刷新panel。可以使用Timer延迟刷新,比如50毫秒。这样可以合并多个大小调整导致的刷新请求,避免过度绘制和闪烁。

Timer timer = new Timer();
timer.Interval = 50;
timer.Tick += (s, e) => panel.Invalidate();

方案: 使用双缓存技术

在我的场景中没什么效果:
http://csharp.tips/tip/article/852-how-to-prevent-flicker-in-winforms-control
https://chuxing.blog.csdn.net/article/details/38313575

标签:string,pictureBox,闪屏,BackgroundImage,pictureBox1,组件,fileName,背景图,winform
From: https://www.cnblogs.com/harrychinese/p/flicker.html

相关文章

  • jQuery Backstretch动态设置背景图片插件
    [url]http://www.2cto.com/kf/201411/348425.html[/url]官方:[url]https://github.com/srobbin/jquery-backstretch[/url]<scriptsrc="Scripts/jquery-1.8.2.min.js"></script><scriptsrc="Scripts/jquery.backstretc......
  • winform中使用yaml配置文件
    1、引入nuget包NetEscapades.Configuration.YamlMicrosoft.Extensions.Configuration.Binder引入上面两个包2、新增yaml文件可以新增到目录中,也可以放在根目录,我这边新增到了Conf文件夹中。创建一个Conf文件夹,然后里面创建一个myconfig.yaml文件。......
  • 使用ILMerge将多个DLL整合进winform程序
    ILMerge是微软开发的工具用于将多个dll、exe等合并,项目已经开源在github 命令行方式使用范例:ILMerge.exe /ndebug/target:winexe/out:output.exe1.exe1.dll2.dll3.dll......
  • c#winform 文字阅读工具,可以暂停 可以继续 可以从光标处开始阅读
    c#winform文字阅读工具支持暂停支持继续支持从光标处开始具体源码可以与我沟通 //stringtext1=textBoxX1.Text;//SpVoicevoice=newSpVoice();//voice.Voice=voice.GetVoices().Item(0);////音量......
  • c# winform 网页录制执行脚本功能
    支持输入指定的网址支持配置点击位置支持查找网页元素支持模拟输入内容,不影响其他操作支持循环运行支持调整执行顺序支持删除指令行支持adsl拨号支持清楚浏览器cookie  ......
  • C# WINFORM 打砖块游戏,可以进行两队PK 程序源码
    C#WINFORM打砖块游戏红色绿色阵营,球可以自定义添加,图片可以设置为网络地址的头像,可以进行与评论和弹幕进行建设。 支持球增加支持球加速支持一键初始化游戏支持pk支持积分累计程序代码还有完全开发完毕,有些小细节还需要再进行优化程序使用纯原生代码,没有使用任何第三......
  • winform dataGridView MultipleLayeredColumnHeader
    privatevoidMainForm_Load(objectsender,EventArgse){this.dataGridView1.Columns.Add("JanWin","Win");this.dataGridView1.Columns.Add("JanLoss","Loss");this.dataGri......
  • 【WebView2】(二)WinForm 引入 WebView2 显示 Web 内容
    https://www.itsvse.com/thread-10362-1-1.html需求:使用VS2022新建一个.NETFramework4.7.2的WinForm项目,引用Microsoft.Web.WebView2SDK包,使用WebView2控件显示和渲染Web应用。MicrosoftEdgeWebView2控件允许在本机应用中嵌入web技术(HTML、CSS以及JavaSc......
  • 为视障者打造无障碍的 WinForms 应用程序
    如何在WindowsForms应用程序中改善屏幕阅读器可访问性屏幕阅读器是一种辅助技术,可以通过语音或者盲文显示器来读出屏幕上的内容,帮助视力障碍者使用计算机。WindowsForms是一种基于.NETFramework的桌面应用程序开发技术,提供了丰富的控件和组件,以及一些可访问性功能,可以让开......
  • WinForm中给弹窗添加遮罩层
    1.新建三个窗体:  2.MainForm主窗体代码如下: privateMaskForm_shadowForm;///<summary>///显示遮罩层///</summary>privatevoidShowMask(){_shadowForm=newShadowForm......