修改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); } } }
修改说明
- 原
Timer1_Tick遍历所有面板同步更新,改为仅先更新第一个面板,完全对齐Python代码的逻辑 - 当第一个面板的灰度索引达到最大值时,重置为0,然后从第二个面板开始依次进位
- 进位过程中,若某个面板递增后超过灰度数量,重置为0并继续进位下一个;若未超过,更新颜色后停止进位,避免所有面板同步重置
内容的提问来源于stack exchange,提问作者Mazen Mourad
相关产品推荐
相关产品推荐

