PictureBox
の位置がTransparent
であるかどうかを確認するには、Image
とSizeMode
のプロパティがPictureBox
であるかどうかによって異なります。
GetPixel
はBitmap
です。イメージの場所とサイズはSizeMode
に基づいて異なるため、単純に使用することはできません。最初SizeMode
に基づいてImage
の大きさや位置を検出する必要があります
public bool HitTest(PictureBox control, int x, int y)
{
var result = false;
if (control.Image == null)
return result;
var method = typeof(PictureBox).GetMethod("ImageRectangleFromSizeMode",
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
var r = (Rectangle)method.Invoke(control, new object[] { control.SizeMode });
using (var bm = new Bitmap(r.Width, r.Height))
{
using (var g = Graphics.FromImage(bm))
g.DrawImage(control.Image, 0, 0, r.Width, r.Height);
if (r.Contains(x, y) && bm.GetPixel(x - r.X, y - r.Y).A != 0)
result = true;
}
return result;
}
その後、あなたは、単にマウスがPictureBox
の非透過領域の上にあるかどうかを確認するためにHitTest
メソッドを使用することができます。
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
if (HitTest(pictureBox1,e.X, e.Y))
pictureBox1.Cursor = Cursors.Hand;
else
pictureBox1.Cursor = Cursors.Default;
}
private void pictureBox1_MouseClick(object sender, MouseEventArgs e)
{
if (HitTest(pictureBox1, e.X, e.Y))
MessageBox.Show("Clicked on Image");
}
また、BackColor
〜Color.Transparent
と設定すると、PictureBox
はその親に対して透過的になります。たとえば、Form
に2のPictureBox
がある場合、透過的なバックカラーを設定すると、フォームの背景が表示されます。透明な背景をサポートするPictureBox
を作成するには、コントロールの背後にあるものを自分で描画する必要があります。この投稿にはTransparentPictureBox
があります:How to make two transparent layer with c#?
ああ、これはあなたがコメント内の 'SizeMode'参照の意味です。コードをありがとう! –
@AniruddhaVarmaはい。上記のコードを使用すると、ポイントが透明かどうかを確認することができます。 'StretchImage'、' Zoom'、 'CenterImage'、' Normal'のような異なる 'SizeMode'値を使って正しく動作します。 –
'BackColor'を' Color.Transparent'に設定するだけで、 'PictureBox'はその親に対して相対的に透明になります。例えば、 'Form'に2つの' PictureBox'を置いて透明な背景色を設定した場合、フォームの背景が見えます。透明な背景をサポートする 'PictureBox'を作るためには、コントロールの背後にあるものを自分で描画する必要があります。あなたはこの投稿で 'TransparentPictureBox'を見つけることができます:[C#で透明なレイヤーを作る方法](http://stackoverflow.com/a/36102074/3110834) –