【问题标题】:Change color of panel when mouse clicked?单击鼠标时更改面板的颜色?
【发布时间】:2012-08-11 07:31:21
【问题描述】:

我是 Visual C# 的新手

我想做一个订票系统(比如电影院),我用面板创建了座位,每个座位都是40 * 40

这是我的代码:

private void panel2_Paint(object sender, PaintEventArgs e)
{
    int a, b;

    for (a = 0; a <= 1; a++)
    {
        for (b = 0; b < 12; b++)
        {

            Graphics g = e.Graphics;
            g.FillRectangle(new SolidBrush(Color.White), b * 40, a * 40, 40, 40);
            g.DrawRectangle(new Pen(Color.Black), b * 40, a * 40, 40, 40);

        }
    }
}

现在我想通过鼠标点击更改每个座位的颜色,以显示已选择的座位;但到目前为止还没有运气

【问题讨论】:

    标签: c# .net winforms panel


    【解决方案1】:

    您最好为每个选定的座位创建单独的控件并处理它们的 Click 事件。在此示例中,我将 24 PictureBox's 添加到 Panel。然后我将它们的索引放在控件的Tag 属性中,并附加了一个通用的单击事件处理程序。我还使用Bool 数组来跟踪所选状态。

    public partial class Form1 : Form
    {
        bool[] selected = new bool[24];
        public Form1()
        {
            InitializeComponent();
            foreach (PictureBox  pb in panel1.Controls)
            {
                pb.Click += new EventHandler(pictureBox_Click);
            }
        }
    
        private void pictureBox_Click(object sender, EventArgs e)
        {
            PictureBox pb = (PictureBox)sender;
            int index ;
            if (int.TryParse(pb.Tag.ToString(), out index))
            {
                if (selected[index])
                {
                    selected[index] = false;
                    pb.BackColor = Color.White;
                }
                else
                {
                    selected[index] = true;
                    pb.BackColor = Color.Red;
                }
            }
        }
    }
    

    如果您创建一个布尔数组来存储座椅的状态,您可以使用已有的东西,使用面板的 MouseDown 事件来设置变量并使与您的座椅相关的屏幕矩形无效。

    类似的东西。

    public partial class Form1 : Form
    {
        bool[,] selected = new bool[2,12];
        public Form1()
        {
            InitializeComponent();
        }
    
        private void panel1_Paint(object sender, PaintEventArgs e)
        {
            int a, b;
    
            for (a = 0; a <= 1; a++)
            {
                for (b = 0; b < 12; b++)
                {
    
                    if (selected[a, b])
                    {
                        e.Graphics.FillRectangle(new SolidBrush(Color.Red), b * 40, a * 40, 40, 40);
    
                    }
                    else
                    {
                        e.Graphics.FillRectangle(new SolidBrush(Color.White ), b * 40, a * 40, 40, 40);
                    }
                    e.Graphics.DrawRectangle(new Pen(Color.Black), b * 40, a * 40, 40, 40);
    
                }
            } 
    
        }
    
        private void panel1_MouseDown(object sender, MouseEventArgs e)
        {
            int xPos, yPos;
            xPos = e.X / 40;
            yPos = e.Y / 40;
    
            if ((xPos > 11) || (yPos > 1)) return;
    
            if(selected[yPos,xPos])
                selected[yPos, xPos] = false;
            else
                selected[yPos, xPos] = true;
    
            ((Panel)sender).Invalidate(new Rectangle(xPos * 40,yPos *40,40,40)) ;
        }
    }
    

    【讨论】:

      【解决方案2】:

      OnMouseClick 事件触发时,您可以通过简单地设置与所选座位相对应的控件的BackColor 属性,而不是使用Graphics 对象并直接绘制到窗体上。

      【讨论】:

      • 是的,这是你应该做的。如果您不熟悉 C# 和 WinForms,请务必阅读事件处理。事件在 Windows 编程中非常重要。
      • @CodyGray 你能给我一个代码示例吗?我对此很陌生,真的不知道从哪里开始
      • @TanyaLertwichaiworawit 刚开始时,我了解事件处理程序的工作方式是简单地将按钮控件拖到窗体上,然后双击它。这会自动为按钮的 OnClick 事件生成一个事件处理程序,该事件将在每次按钮正常单击时执行!
      猜你喜欢
      • 1970-01-01
      • 2016-02-05
      • 1970-01-01
      • 1970-01-01
      • 2015-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多