こんにちはR G B
値を設定する方法System.Drawing.Color.G
?
System.Drawing.Color.G=255;
読み取り専用であるため、これは許可されていません
Property or indexer 'System.Drawing.Color.G' cannot be assigned toit is read only
Color
カスタムR G B
値を割り当ててオブジェクトを作成する必要があります
こんにちはR G B
値を設定する方法System.Drawing.Color.G
?
System.Drawing.Color.G=255;
読み取り専用であるため、これは許可されていません
Property or indexer 'System.Drawing.Color.G' cannot be assigned toit is read only
Color
カスタムR G B
値を割り当ててオブジェクトを作成する必要があります
回答:
Color
構造は不変、特定のインスタンスが作成された後、そのプロパティの値を変更することができないことを意味し、(すべての構造が本当にあるべきな)。
代わりに、必要なプロパティ値を使用して構造の新しいインスタンスを作成する必要があります。コンポーネントのRGB値を使用して色を作成するため、次のFromArgb
方法を使用する必要があります。
Color myColor = Color.FromArgb(100, 150, 75);
新しい色構造を作成するには、Color.FromArgbメソッドを使用する必要があります
var newColor = Color.FromArgb(0xCC,0xBB,0xAA);
1つのカラーコンポーネントを変更するだけの拡張機能を作成できます
static class ColorExtension
{
public static Color ChangeG(Color this color,byte g)
{
return Color.FromArgb(color.A,color.R,g,color.B);
}
}
次に、これを使用できます。
yourColor = yourColor.ChangeG(100);
yourColor = Color.FromArgb(yourColor.A,yourColor.R,100,yourColor.B);
。だからそれは
G
か、それとも他の効果もあるのかが視覚的にほとんど明らかではないということです。Color構造体の設計を考えると、それを修正する良い方法はないと思います。ArgbColor
4つの公開されたシングルバイトフィールドを持つ単純な構造体と、Color
それが暗黙的に変換可能なクラスがあったvar temp = myColor.AsArgb(); temp.Green=100; myColor = temp;
場合、たとえばmyColor
名前付きまたはシステムカラーであった場合は...
AsArgb
特性はメソッドによって除外されますが、そのメソッドによって除外されなかった特性Green
は保持されます。実際、オープンフィールド構造タイプに変換する拡張メソッドを定義した場合、そのアプローチはColor
定義されたとおりでも機能する可能性があり、物事を行うための最良の方法である可能性があります。
using System;
using System.Drawing;
public struct MyColor
{
private byte a, r, g, b;
public byte A
{
get
{
return this.a;
}
}
public byte R
{
get
{
return this.r;
}
}
public byte G
{
get
{
return this.g;
}
}
public byte B
{
get
{
return this.b;
}
}
public MyColor SetAlpha(byte value)
{
this.a = value;
return this;
}
public MyColor SetRed(byte value)
{
this.r = value;
return this;
}
public MyColor SetGreen(byte value)
{
this.g = value;
return this;
}
public MyColor SetBlue(byte value)
{
this.b = value;
return this;
}
public int ToArgb()
{
return (int)(A << 24) || (int)(R << 16) || (int)(G << 8) || (int)(B);
}
public override string ToString ()
{
return string.Format ("[MyColor: A={0}, R={1}, G={2}, B={3}]", A, R, G, B);
}
public static MyColor FromArgb(byte alpha, byte red, byte green, byte blue)
{
return new MyColor().SetAlpha(alpha).SetRed(red).SetGreen(green).SetBlue(blue);
}
public static MyColor FromArgb(byte red, byte green, byte blue)
{
return MyColor.FromArgb(255, red, green, blue);
}
public static MyColor FromArgb(byte alpha, MyColor baseColor)
{
return MyColor.FromArgb(alpha, baseColor.R, baseColor.G, baseColor.B);
}
public static MyColor FromArgb(int argb)
{
return MyColor.FromArgb(argb & 255, (argb >> 8) & 255, (argb >> 16) & 255, (argb >> 24) & 255);
}
public static implicit operator Color(MyColor myColor)
{
return Color.FromArgb(myColor.ToArgb());
}
public static implicit operator MyColor(Color color)
{
return MyColor.FromArgb(color.ToArgb());
}
}