オブジェクトをコンテナ内にスタックできるようにする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);
}
}