我有两个面板在彼此的顶部。下面的那个比顶部的那个大一点。我在最顶层的面板上使用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面板。
答案 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 (它提供更好的图形并使用硬件加速)。