2016-08-16 3 views
2

두 개의 PictureBox가 겹치는 C#에서 Windows 양식을 만들어야합니다. TopPictureBox는 투명한 PNG 그림을 포함하고 있습니다. 기본적으로 TopPictureBox는 TopPictureBox에서 이미지의 보이거나 투명한 영역을 클릭하여 클릭 할 수 있습니다. 하지만 투명 영역이 아닌 이미지의 가시 영역을 클릭하여 TopPictureBox 만 클릭 할 수있게하려고합니다. 또한 그 커서가 투명 영역이 아닌 이미지의 가시 영역에서만 변경되도록하려고합니다.PictureBox - 이미지의 투명하지 않은 영역에서 이벤트 클릭 처리

이 방법이 있습니까?

이 코드를 사용하여 TopPictureBox를 투명하게 만듭니다.

TopPictureBox.BackColor = Color.Transparent; 

감사합니다.

enter image description here

답변

2

PictureBox의 위치가 Transparent인지 확인하려면 ImageSizeMode 속성이 PictureBox 인 지 확인하십시오.

GetPixel은 에 따라 이미지 위치와 크기가 다르기 때문에 Bitmap을 사용할 수 없습니다.

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"); 
} 

: 마우스가 PictureBox의 불투명 한 지역에 걸쳐있는 경우

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; 
} 

그런 다음 당신은 단순히 확인하는 HitTest 방법을 사용할 수 있습니다 : 먼저 SizeMode에 따라 크기와 Image의 위치를 ​​감지한다 또한 BackColor에서 Color.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

감사합니다 & 죄송합니다. Cursor와 함께 할 수있는 방법이 있습니까? –

+0

@Suprovo 클릭하는 대신 커서가 폼 위로 이동하면? –

+0

** 1 ** 이미지가'PictureBox'의'SizeMode'를 기반으로 한'PictureBox'의 중심에 있으면 어떨까요? ** 2. ** PictureBox 아래에있는 이미지의 깊고 푸른 부분을 'this.BackColor'와 비교하면 잘못된 것처럼 보입니다. –

관련 문제