c#在Winform下如何实现在picturebox中高频率绘制大量矩形不闪烁

ace_chn ace_chn 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
平台是winform,用的C#。
背景:实时(20毫秒刷新周期)获取在线检测进度,每1000为一个单位,循环刷新。合格品在进度条中显示绿色,不合格品在进度条中显示红色,当前检测单位(1000为一个单位)内的检测数量在进度条中显示棕色。
个人解决方案:我用了一个picturebox来绘制整个进度条,初始化时把picturebox分割成了1000个矩形。定义了一个容量为1000的数组,包括矩形的位置,以及绘制矩形的颜色。用多线程BackgroundWorker每20毫秒刷新获取检测数据,并在进度条中绘制检测结果。我在picturebox的Paint函数中用FillRectangle实现绘制,每次调用picturebox.refresh,就是绘制当前1000个矩形的颜色。
问题:1.绘制的指示进度的矩形会闪烁(我即使只绘制进度矩形,也会闪烁)。双缓冲也开了,无效。
2.如果多条生产线,生成多个进度条,占用系统资源较多。
请高手帮看看代码,或者指点其它途径,多谢!


public partial class Form1 : Form
{
public struct CheckProgress
{//检测进度
public System.Drawing.RectangleF[] DrawRect; // 矩形数组
public System.Drawing.Brush[] DrawBush;// 每个矩形对应的Brush
}
CheckProgress m_DrawCheckProgress;
int CheckProgressLength; //进度条总长度
int m_DrawCounter; //检测进度游标
public Form1()
{
InitializeComponent();
CheckProgressLength = 1000;
m_DrawCounter = 0;
}

Color[] DrawColor = new Color[3] { Color.Red, Color.Green, Color.Yellow };
int rand()
{// 调试用随机数, 用于随机生成大约2%的不合格品
Random r = new Random();
if (r.Next(100) < 97)
{
return 1;
}
else return 0;
}


private void Form1_Load(object sender, EventArgs e)
{
// Initialize Struct CheckProgressBar
m_DrawCheckProgress = new CheckProgress();
m_DrawCheckProgress.DrawRect = new System.Drawing.RectangleF[CheckProgressLength];
m_DrawCheckProgress.DrawBush = new System.Drawing.Brush[CheckProgressLength];

//将Picturebox分割成1000个小矩形
for (int i = 0; i < m_DrawCheckProgress.DrawRect.Length; i++)
{
m_DrawCheckProgress.DrawRect[i] = new RectangleF(PicMainProgress.Width * i * 1.0f / CheckProgressLength, 0, PicMainProgress.Width * 1.0f / CheckProgressLength, PicMainProgress.Height);
m_DrawCheckProgress.DrawBush[i] = new SolidBrush(PicMainProgress.BackColor);
}

//Start Thread
if (false == Bgw_CheckResult.IsBusy)
{
Bgw_CheckResult.RunWorkerAsync();
}
}
//
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
Random random = new Random(); //调试用随机数, 用于随机生成大约2%的不合格品
while (false == Bgw_CheckResult.CancellationPending)
{//调试用
Color c;
int rd = rand();
if (1 == rd)
{
c = Color.Green;
}
else
{
c = Color.Red;
}
m_DrawCheckProgress.DrawBush[m_DrawCounter % CheckProgressLength] = new SolidBrush(c);

// 设置游标颜色(占据2个矩形)
int n = 2;
for (int i = 0; i < n; i++)
{//防止溢出
if (m_DrawCounter % CheckProgressLength + n < CheckProgressLength)
{
m_DrawCheckProgress.DrawBush[m_DrawCounter % CheckProgressLength + (i+1)] = new SolidBrush(Color.Blue);
}
}
//
Bgw_CheckResult.ReportProgress(1);
m_DrawCounter++;
Thread.Sleep(20);
}
}
//
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
// Refresh Picturebox
PicMainProgress.Refresh();
}
//进度条绘制函数
private void PicMainProgress_Paint(object sender, PaintEventArgs e)
{
e.Graphics.Clear(SystemColors.Control);
for (int i = 0; i < m_DrawCheckProgress.DrawRect.Length; i++)
{
e.Graphics.FillRectangle(m_DrawCheckProgress.DrawBush[i], m_DrawCheckProgress.DrawRect[i]);
}
e.Dispose();
}

}
...全文

相关推荐

《模式识别与数据挖掘》配套PPT课件

《模式识别与数据挖掘》配套PPT课件

Bryan Ding

科技成果转化项目进场交易前,评估备案环节需要准备哪些材料?_8.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

BIZKEEN

人工智能通识教育(中职版)课程标准+PPT课件+部分素材+电子活页+在线考核

人工智能通识教育(中职版)课程标准+PPT课件+部分素材+电子活页+在线考核

Bryan Ding

跨境电商供应链管理(AIGC版)课件+教案+参考答案

跨境电商供应链管理(AIGC版)课件+教案+参考答案

Bryan Ding

110KV单电源电网三段式电流保护+距离继电保护整定计算说明报告(23页+6000字)

内容概要:本文是一份关于110kV单电源电网继电保护整定计算的综合性技术报告,全文共23页、约6000字,系统阐述了三段式电流保护与距离保护的设计原理及其整定计算方法。报告深入分析了电力系统在短路故障条件下的电流与阻抗特性,详细推导了电流保护Ⅰ、Ⅱ、Ⅲ段的动作范围、整定原则、灵敏度校验及时间配合机制,确保满足继电保护的选择性、速动性、灵敏性和可靠性“四性”要求。同时,针对长距离或重要输电线路,补充介绍了距离保护的阻抗整定计算方法,并可能结合Matlab进行仿真验证与辅助计算,提升整定结果的准确性与工程实用性。; 适合人群:适用于电气工程及其自动化相关专业的高年级本科生、研究生,以及从事电力系统继电保护设计、运行维护的工程技术人员;要求读者具备电力系统分析、短路计算及继电保护的基础理论知识。; 使用场景及目标:①掌握110kV单电源辐射型电网中三段式电流保护的整定流程与实际计算步骤;②理解距离保护的工作原理及其在复杂工况下的应用优势;③完成实际工程项目的保护配置与整定计算任务,或作为课程设计、毕业设计及科研课题的技术参考资料;④结合Matlab工具实现整定计算的程序化处理与动作特性仿真验证。; 阅读建议:建议读者结合《电力系统继电保护原理》等相关教材同步学习,重点研读整定公式的推导过程与典型算例的计算细节,注意区分电流保护与距离保护的适用场景与配置逻辑,有条件时应利用Matlab等工具对保护动作行为进行建模与仿真,以深化对保护协调配合机制的理解。

欢多天天写代码
评论 27
收藏 已收藏
分享
返回顶部
ace_chn
C# 111,129 成员 642,539 内容