문제

컨테이너 내부에 물체를 쌓을 수있는 GUI를 작성하라는 요청을 받았습니다. 사용자는 상단 다운 뷰 포인트에서 상자를 볼 것입니다. 그들은 또한 내부에 무엇이 쌓여 있는지보고 싶어합니다. 이것을 해결하려는 나의 첫 생각은 투명성이었습니다. 투명성에 대한 일부 게시물을 읽었지만 두 이미지의 문제가 투명 해지는 문제를 해결하지 못했기 때문에 쌓인 경우 두 가지를 모두 볼 수있었습니다.

다른 컨트롤과 함께 컨트롤을 투명하게하려면 어떻게해야합니까? 이것이 실제로 불가능하다면; 이 문제에 대한 더 나은 aproach는 무엇입니까?

문제를 해결하기 위해 사용자 정의 컨트롤 (공개 부분 클래스 MyControl : Control)을 사용하고 있습니다. 마침내 컨트롤 투명에 이미지가 있습니다. 부모 양식에 그려진 것은 이미지를 통해 (부모가 엘립스와 사각형을 페인트하기 위해 onpaint를 사용하고 있음)를 보여줍니다. 그러나 그 위에 배치 된 다른 컨트롤은 더 이상 투명하지 않습니다.

이것을 달성하기 위해 내가 사용하는 코드는 다음과 같습니다.

public Image Image 
  {
     get { return m_Image; }
     set { m_Image = value; }
  }
private void GridControl_Paint(object sender, PaintEventArgs e)
  {
     if (Image != null)
     {

        Graphics g = e.Graphics;
        Bitmap bitMap = new Bitmap(Image);

        //This is not working... the color array always comes back empty
        //This is how I would rather making things transparent...
        Color[] colorArray = bitMap.Palette.Entries;

        if (colorArray.Length > 0)
        {

           ColorMap[] colorMap = new ColorMap[colorArray.Length];

           for (int index = 0; index < colorArray.Length; index++)
           {
              colorMap[index] = new ColorMap();
              colorMap[index].OldColor = colorArray[index];
              colorMap[index].NewColor = Color.Transparent;
           }

        }

        //Ok fine so the above is not working... let me force it.
        //Get each pixel in the image and change the color.
        else
        {
           for (int x = 0; x < bitMap.Width; x++)
           {
              for (int y = 0; y < bitMap.Height; y++)
              {
                 Color pixelColor = bitMap.GetPixel(x, y);
                 Color newColor = Color.FromArgb(100, pixelColor);

                 bitMap.SetPixel(x, y, newColor);
              }
           }
        }

        bitMap.MakeTransparent();

        g.DrawImage(bitMap, this.ClientRectangle);
     }

  } 
도움이 되었습니까?

해결책 2

이 문제에 대한 좋은 해결책을 찾을 수 없었습니다. 내가 이것을하는 유일한 방법은 사용자 정의 컨트롤을 만들고 많은 사용자 정의 코드를 사용하는 것입니다 (여전히 완전히 작동하지 않는). 답은 다음과 같이이 스레드를 닫을 것입니다.

이 포럼에서 답변하기에는 너무 복잡합니다.

다른 팁

WinForms를 사용하는 데 잠겨 있습니까? 당신이 설명하는 것과 같이 적당히 까다로운 그래픽 작업을 수행해야하고 앱을 다시 설계 할 수 없다면 WPF로 도약 할 수 있습니다.

GDI+ 그래픽에서 연주 한 지 오래되었으므로 여기에 아이디어가 있습니다 (그러나 코드 없음;) :

쌓인 컨트롤이 실제로 작동해야합니까? 그렇지 않은 경우 외관을 비트 맵에 복사하여 숨긴 다음 자신의 페인트 루틴에서 비트 맵을 사용할 수 있습니다. 컨트롤이 작동해야 할 때는 해제 할 수 있습니다.

그건 그렇고, bitmap.getpixel 또는 setpixel을 사용하는 것은 매우 느립니다. 다음은 조작 된 32 비트 비트 맵 (파란색, 녹색, 빨간색 및 알파가 바이트 인 경우)에 누워 있던 오래된 코드입니다.

BitmapData bmpData = bitmap.LockBits(pixelRect, ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);

unsafe
{
    byte* bytes = (byte*)bmpData.Scan0;
    for (int row = 0; row < pixelRect.Height; row++)
    {
        for (int col = 0; col < pixelRect.Width * 4; ) // * 4: 4 bytes per pixel 
        {
            bytes[row * bmpData.Stride + col++] = blue;
            bytes[row * bmpData.Stride + col++] = green;
            bytes[row * bmpData.Stride + col++] = red;
            bytes[row * bmpData.Stride + col++] = alpha;
        }
    }
}

// Unlock the bits.
bitmap.UnlockBits(bmpData);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top