2

私はお互いの上に2つのパネルを持っています。下の方が上より少し大きいです。一番上のパネルで CreateGraphics() メソッドを使用して画像をペイントしています。(わかりやすくするために、この画像は透明な穴のある 4 つのグリッドを接続したものです)。次に、下のパネルにピクチャ ボックスを追加し、このグリッドの後ろから表示する必要があります。

下のグリッドに画像ボックスのコントロールを追加しています。また、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にチップを描画します。チップの落下を表示したい場合は、現在のビットマップ( PictureBoxのImageプロパティ) のコピーを保存し、チップを別のy座標 (0 からグリッド上の最終位置まで) に描画する必要があります。ダブルバッファ技術と同じです。

ここに小さな例があります (この例では "pictureBox2" という名前のPictureBoxを持つフォームが必要です):

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 に答える