簡體   English   中英

堆疊控件(Winforms C#)(透明)

[英]Stacking Controls (Winforms C#) (Transparent)

我被要求編寫一個GUI,該GUI將允許將對象堆疊在容器內。 用戶將從上至下的角度查看這些框。 他們還希望能夠看到里面堆積的東西。 解決這個問題的第一個想法是透明度。 我已經閱讀了一些有關透明度的文章,但是我找不到能解決兩個圖像都透明的問題,因此您可以看到兩個圖像是否堆疊在一起。

如何使控件與頂部的其他控件透明。 如果這不可能的話; 有什么更好的方法來解決這個問題?

我正在使用自定義控件(公共局部類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);
     }

  } 

您是否被鎖定使用WinForms? 如果您需要做一些中等難度的圖形工作(例如您所描述的),並且無法重新設計應用程序以解決問題,則可以邁入WPF。

自從我玩過GDI +圖形以來已經有一段時間了,所以這是一個主意(但沒有代碼;)):

您堆疊的控件實際上需要工作嗎? 如果不是,則可以將其外觀復制到位圖,將其隱藏,然后在自己的繪制例程中使用位圖。 當控件需要工作時,您可以取消隱藏它。

順便說一句,使用bitmap.GetPixel或SetPixel非常慢。 這是一些我操縱過的32位位圖的舊代碼(藍色,綠色,紅色和alpha是字節):

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 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM