You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

修改Visual Studio WinForms代码实现面板灰度组合循环功能

修复WinForms单行灰度面板的循环进位逻辑

需求是实现和以下Python代码一致的灰度循环逻辑:用户指定单行面板数量,第一个面板遍历所有灰度后,下一个面板递增一个灰度,依次进位,展示所有可能的灰度组合。

参考的Python实现代码:

import time

length = int(input("Enter length of the list: "))
my_list = [0]*length
j=1

while True:
        time.sleep(0.5)
        if my_list[0] == 4:
            my_list[0] = 0
            for j in range(1,len(my_list)):
                my_list[j]+=1
                if my_list[j] % 4 != 0:
                    break
                else:
                    my_list[j] = 0
        print(my_list)
        my_list[0] += 1
        if j == len(my_list):
            j=1

原WinForms代码的Timer1_Tick方法逻辑错误,导致所有面板同步更新,不符合进位需求。以下是修改后的完整代码:

using System;
using System.Drawing;
using System.Windows.Forms;

namespace WinFormsApp12
{
    public partial class Form1 : Form
    {
        private Panel[] panels; // 存储面板的数组
        private int[] panelCurrentShades; // 存储每个面板当前的灰度索引
        private int[] panelShades = new int[] { 0, 36, 73, 109, 146, 182, 219 }; // 灰度值数组,共7个等级
        private System.Windows.Forms.Timer timer1;
        private int numPanels; // 用户输入的面板数量

        public Form1(int numPanels)
        {
            this.numPanels = numPanels;
            InitializeComponent();
            InitializePanels();
            InitializeTimer();
        }
    
        private void InitializePanels()
        {
            panels = new Panel[numPanels];
            panelCurrentShades = new int[numPanels]; // 初始所有面板都用第一个灰度(索引0)
    
            for (int i = 0; i < numPanels; i++)
            {
                Panel panel = new Panel
                {
                    Size = new Size(100, 100),
                    Location = new Point(50 + i * 150, 50), // 水平排列面板,间距150像素
                    BackColor = GetColor(panelShades[panelCurrentShades[i]])
                };
    
                panels[i] = panel;
                Controls.Add(panel);
            }
        }
    
        private void InitializeTimer()
        {
            timer1 = new System.Windows.Forms.Timer();
            timer1.Interval = 250; // 调整更新间隔(毫秒)
            timer1.Tick += Timer1_Tick;
            timer1.Start();
        }
    
        private void Timer1_Tick(object sender, EventArgs e)
        {
            // 先检查第一个面板是否已经到了最后一个灰度
            if (panelCurrentShades[0] == panelShades.Length - 1)
            {
                // 重置第一个面板的灰度索引为0
                panelCurrentShades[0] = 0;
                panels[0].BackColor = GetColor(panelShades[panelCurrentShades[0]]);
                
                // 从第二个面板开始依次进位
                for (int j = 1; j < numPanels; j++)
                {
                    panelCurrentShades[j]++;
                    // 如果当前面板的索引超过最大值,重置为0,继续进位下一个
                    if (panelCurrentShades[j] == panelShades.Length)
                    {
                        panelCurrentShades[j] = 0;
                        panels[j].BackColor = GetColor(panelShades[panelCurrentShades[j]]);
                    }
                    else
                    {
                        // 当前面板进位后未到最大值,更新颜色并停止进位
                        panels[j].BackColor = GetColor(panelShades[panelCurrentShades[j]]);
                        break;
                    }
                }
            }
            else
            {
                // 第一个面板未到最后一个灰度,直接递增并更新颜色
                panelCurrentShades[0]++;
                panels[0].BackColor = GetColor(panelShades[panelCurrentShades[0]]);
            }
        }
    
        private Color GetColor(int grayValue)
        {
            return Color.FromArgb(grayValue, grayValue, grayValue);
        }
    }
}

修改说明

  1. 原Timer1_Tick遍历所有面板同步更新,改为仅先更新第一个面板,完全对齐Python代码的逻辑
  2. 当第一个面板的灰度索引达到最大值时,重置为0,然后从第二个面板开始依次进位
  3. 进位过程中,若某个面板递增后超过灰度数量,重置为0并继续进位下一个;若未超过,更新颜色后停止进位,避免所有面板同步重置

内容的提问来源于stack exchange,提问作者Mazen Mourad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 04:37:48