在透明面板后面添加一个图片框

时间:2013-01-15 22:24:17

标签: c# winforms panel picturebox

我有两个面板在彼此的顶部。下面的那个比顶部的那个大一点。我在最顶层的面板上使用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面板。

enter image description here

1 个答案:

答案 0 :(得分:2)

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

这是一个小例子(你需要一个 Form 带有 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 (它提供更好的图形并使用硬件加速)。