2016-08-16 10 views
2

2つのPictureBoxが重なっているC#でWindowsフォームを作成する必要があります。 TopPictureBoxには透明なPNG画像が含まれています。デフォルトで、TopPictureBoxは、TopPictureBox内の画像の表示領域または透過領域をクリックすることでクリックできます。しかし、透明な領域ではなく、可視領域をクリックすることによって、TopPictureBoxのみをクリックすることができます。また、そのカーソルが透明領域ではなく、画像の可視領域でのみ変更されるようにしたい。PictureBox - 画像の非透明領域のイベントをクリック

これらの方法はありますか?

私はこのコードを使用して、TopPictureBoxを透過的にしています。

TopPictureBox.BackColor = Color.Transparent; 

ありがとうございました。

enter image description here

答えて

2

PictureBoxの位置がTransparentであるかどうかを確認するには、ImageSizeModeのプロパティがPictureBoxであるかどうかによって異なります。

GetPixelBitmapです。イメージの場所とサイズは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"); 
} 

また、BackColorColor.Transparentと設定すると、PictureBoxはその親に対して透過的になります。たとえば、Formに2のPictureBoxがある場合、透過的なバックカラーを設定すると、フォームの背景が表示されます。透明な背景をサポートするPictureBoxを作成するには、コントロールの背後にあるものを自分で描画する必要があります。この投稿にはTransparentPictureBoxがあります:How to make two transparent layer with c#?

+0

ああ、これはあなたがコメント内の 'SizeMode'参照の意味です。コードをありがとう! –

+1

@AniruddhaVarmaはい。上記のコードを使用すると、ポイントが透明かどうかを確認することができます。 'StretchImage'、' Zoom'、 'CenterImage'、' Normal'のような異なる 'SizeMode'値を使って正しく動作します。 –

+1

'BackColor'を' Color.Transparent'に設定するだけで、 'PictureBox'はその親に対して相対的に透明になります。例えば、 'Form'に2つの' PictureBox'を置いて透明な背景色を設定した場合、フォームの背景が見えます。透明な背景をサポートする 'PictureBox'を作るためには、コントロールの背後にあるものを自分で描画する必要があります。あなたはこの投稿で 'TransparentPictureBox'を見つけることができます:[C#で透明なレイヤーを作る方法](http://stackoverflow.com/a/36102074/3110834) –

1

一つの方法は、ユーザがクリックしたピクセルの色は、フォームの背景色と同じであるかどうかをチェックすることです。 「はい」の場合、ユーザは透明な領域をクリックした。

(注:レザは、上述したように、このコードは、画像の透明な領域は、フォームの背景と同じ色である、すなわちときにのみ、重複PictureBoxesが存在しない場合にのみ使用することができる)

Color pixelColour; 

private void myPicturebox_MouseClick(object sender, MouseEventArgs e) 
{ 
    if (e.Button == MouseButtons.Left) 
    { 
    pixelColour = ((Bitmap)myPicturebox.Image).GetPixel(point.X, point.Y); 
    if (this.BackColor == pixelColour) 
    { 
     // User clicked on transparent area 
    } 
    else 
    { 
     // User clicked on image 
    } 
    } 
} 
+0

ありがとうございました。それでは、申し訳ありません。 –

+0

@Suprovoクリックするのではなく、フォーム上をカーソルが移動したときを意味しますか? –

+0

** 1。**イメージが 'PictureBox'の' SizeMode'に基づいて 'PictureBox'の中心にある場合はどうなりますか? ** 2。** PictureBoxの下にある画像の濃い青色の部分で、 'this.BackColor'との比較が間違っているようです。 –

関連する問題