c#在Winform下如何实现在picturebox中高频率绘制大量矩形不闪烁
背景:实时(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();
}
}
相关推荐
AI Design Skills一个不断壮大的设计技能合集,适用于 AI 编码工具
用户可借助此项目为 Claude Code、Cursor 等 AI 编码工具添加设计技能,轻松构建如着陆页等内容。项目包含多个独立设计技能文件夹,支持自定义设计值,安装方式简单适配多种工具
Path-Planning-Algorithm-main.zip
1.版本:matlab2014a/2019b/2024b 2.附赠案例数据可直接运行。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
高校技术转移办公室人员如何提升科技成果推介书的撰写效率?.docx
科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。
三相并网逆变器无功功率扰动+孤岛检测控制算法仿真【参考文献+仿真】
内容概要:本文围绕“三相并网逆变器无功功率扰动+孤岛检测控制算法仿真”展开,系统阐述了在新能源并网背景下,利用无功功率扰动法实现孤岛效应检测的关键技术原理与仿真方法。依托MATLAB/Simulink平台构建完整的三相并网逆变器控制系统模型,详细展示了控制策略的设计流程、算法实现机制及动态响应特性分析,重点突出孤岛检测的判据设定、扰动注入方式与检测盲区(NDZ)的优化。文档配套提供参考文献、仿真模型文件及相关技术说明,具备较强的理论深度与工程复现价值,是研究并网逆变器保护控制的重要参考资料。该资源隶属于“荔枝科研社”系列科研资料,聚焦电力电子与新能源并网领域的前沿技术仿真与论文复现。; 适合人群:适用于电力系统、电气工程及其自动化、新能源科学与工程等相关专业的高校研究生、科研人员,以及从事光伏/风电并网、微电网控制等方向的技术研发工程师,要求具备扎实的电力电子技术基础和一定的MATLAB/Simulink仿真能力。; 使用场景及目标:①深入理解无功功率扰动法在孤岛检测中的应用机理与实现步骤;②支撑毕业设计、科研课题或学术论文的仿真验证与结果复现;③用于新能源发电系统并网安全性分析与保护策略开发的实际工程参考;④辅助教学与培训中对复杂控制算法的可视化讲解与实践操作。; 阅读建议:建议结合所提供的参考文献与仿真文件同步学习,按照目录顺序逐步调试模型参数,重点关注控制环路设计、扰动信号幅值与频率设置对检测精度的影响,并通过仿真波形分析系统在不同工况下的动态行为,全面提升对实际工程问题的建模与解决能力。
《跨媒体移动应用理论与实践》配套PPT课件
《跨媒体移动应用理论与实践》配套PPT课件


