我被要求写一个GUI,将允许在容器内,以被堆叠的物体。用户将从俯视点观看的框。他们也希望能够看到里面是什么堆叠。我首先想到的解决,这是透明度。我看过一些关于透明度的职位,但我没有找到任何解决两个图像的问题是透明的,所以你能看到两个,如果他们堆放。

我怎样才能获得该控制是透明的,顶部其他控件。如果这是不是真的有可能;什么是更好的形式给出了这个问题?

我使用的一个自定义的控制(公共部分类MyControl:控制)来解决该问题。我终于对控制透明的形象。即母体形式上绘制任何显示直通图像(我使用的OnPaint父画一个elipse和正方形),置于其上但其他控制不再是透明的。

我使用来完成,这代码如下:

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