2

我有两个面板在彼此的顶部。下面那个比上面那个大一点。我正在使用最顶部面板上的 CreateGraphics() 方法绘制图像。(要清楚的是,这个图像是一个连接四个带有透明孔的网格)。现在我需要做的是在底部面板中添加一个图片框,并让它从这个网格后面显示出来。

我正在将图片框的控件添加到底部网格。我也在使用 BringToFront() 方法。我该怎么做才能让图片框显示在网格下方?

在下面的代码中:chipHolder 是底部面板,grid 是最顶部面板,picBox 分别是图片框

public void addControl()
{
   chipHolder.Controls.Add(picBox);
   picBox.BringToFront();
}

// This piece of code is in a mouse_click event of grid 
Graphics g = grid.CreateGraphics();
addControl();

// to make the picture move downwards
for (int i = 0; i < newYloc; i++)
{
     picBox.Location = new Point(newXloc, picBox.Top + 1);
     picBox.Show();
}

// drawing the grid image on the grid panel
protected virtual void grid_Paint(object sender, PaintEventArgs e)
{
     Image img = Properties.Resources.grid_fw;

     gridGraphics = grid.CreateGraphics();
     gridGraphics.DrawImage(img, 0, 0, 650, 550);
}

为了获得更好的画面,这就是我的面板的样子。选择的是chipHolder面板。

在此处输入图像描述

4

1 回答 1

2

您可以尝试不同的方法:不要使用Panel并使用单个PictureBox,这样您就可以在该PictureBox中绘制所有内容。因此,您使用 PictureBox 的MouseDown事件处理程序来计算用户单击的(虚拟)单元格(您需要执行简单的除法),然后在PictureBox上绘制芯片。如果要显示芯片掉落,则需要保存当前Bitmap的副本(PictureBox的Image属性)并在不同的y坐标(从 0 到其在网格上的最终位置)上绘制芯片,这就像双缓冲技术一样。

这是一个小例子(你需要一个带有PictureBox的表单,在这个例子中它被命名为“pictureBox2”):

public partial class Form1 : Form
{
    Bitmap chip = new Bitmap(40, 40, PixelFormat.Format32bppArgb);

    public Form1()
    {
        InitializeComponent();
        using (Graphics g = Graphics.FromImage(chip))
        {
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
            g.FillEllipse(new SolidBrush(Color.FromArgb(128, 255, 80, 0)), 1, 1, 38, 38);
        }
        pictureBox2.Image = new Bitmap(pictureBox2.Width, pictureBox2.Height, PixelFormat.Format32bppArgb);
        using (Graphics g = Graphics.FromImage(pictureBox2.Image))
        {
            g.Clear(Color.Yellow);
        }
    }

    private void pictureBox2_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            Text = e.Location.ToString();
            using (Graphics g = Graphics.FromImage(pictureBox2.Image))
            {
                g.DrawImage(chip, e.Location.X - 20, e.Location.Y - 20);
            }
            pictureBox2.Invalidate();
        }
    }
}

如果您想要真正透明的控件,您应该使用WPF(它提供更好的图形并使用硬件加速)。

于 2013-01-16T03:11:54.893 回答