Frage

Ich bin gebeten worden, eine GUI zu schreiben, die Objekte können in einem Container gestapelt werden. Der Benutzer wird die Kisten von einem Top-Down-Sicht Punkt werden sehen. Sie würden auch in der Lage sein, um zu sehen, was ist innen gestapelt ist. Mein erster Gedanke, diese zu lösen war Transparenz. Ich habe einige der Beiträge auf Transparenz zu lesen, jedoch habe ich nicht finden, die die Fragen der beiden Bilder transparent gelöst, so dass Sie der Lage war, um zu sehen, beide, wenn sie gestapelt sind.

Wie kann ich die Steuerung mit anderen Kontrollen auf transparent zu sein. Ist dies nicht wirklich möglich ist; Was ist eine bessere aproach für dieses Problem?

Ich bin mit einem benutzerdefinierten Steuerelement (public partial class MyControl: Control), das Problem zu lösen. Ich habe schließlich das Bild auf dem Steuer transparent. Alles, was auf der übergeordneten Form gezogen wird, zeigt durch das Bild (Ich bin die OnPaint für die Eltern mit einem elipse und ein Quadrat zu malen), aber auch andere Kontrollen darüber gelegt ist nicht mehr transparent.

Der Code Ich verwende dies zu erreichen unter:

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

  } 
War es hilfreich?

Lösung 2

Ich habe nicht in der Lage gewesen, eine gute Lösung für dieses Problem zu finden. Der einzige Weg, die ich gefunden habe, dies zu tun ist durch eine individuelle Kontrolle zu schaffen und eine Menge von benutzerdefinierten Code verwenden (die ich immer noch nicht voll funktionsfähig). Ich werde diesen Thread mit der Antwort Wesen schließen:

Es ist zu kompliziert in diesem Forum zu beantworten.

Andere Tipps

Sind Sie in mit WinForms gesperrt? Wenn Sie viel mäßig schwierige Grafiken Sachen tun müssen (wie Sie beschreiben) und Redesign können Ihre App nicht um es zu bekommen, könnten Sie den Sprung in WPF machen.

Es ist schon eine Weile her, seit ich in GDI + Grafik gespielt habe, so ist hier eine Idee (aber kein Code;)):

Sie Ihre gestapelt Kontrollen müssen tatsächlich arbeiten? Wenn nicht, Sie ihr Aussehen zu Bitmaps kopieren können, verstecken sie, dann die Bitmaps Farbe Routinen in Ihren eigenen verwenden. Wenn ein Steuerelement arbeiten muss, kann man es sichtbar machen.

Durch die Art und Weise, bitmap.GetPixel oder SetPixel Verwendung ist sehr langsam. Hier einige alte Code, den ich um die manipuliert 32bit Bitmaps gelegen hatte (wo blau, grün, rot und Alpha sind Bytes):

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);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top