ゲームエフェクトデザイナーのブログ | A Real-Time VFX Artist's Blog

About Making Materials on UE, Making Tools with C#, etc

C# カラー管理クラスを考える

Formのコントロールの各色をRGB値でカラー指定したいという場合に「カラー管理クラスを作った方が良さそうだな」と思い、色の値を扱うプロパティを試してみました。

テストで作成したのはこちら。

f:id:moko_03_25:20180927012732g:plain

コードはこちらのような感じ。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    // ボタン1クリック
    private void button1_Click(object sender, EventArgs e)
    {
        MyColor mc = new MyColor();

        // 配列の場合
        this.panel1.BackColor = Color.FromArgb(mc.c[0], mc.c[1], mc.c[2]);
    }

    // ボタン2クリック
    private void button2_Click(object sender, EventArgs e)
    {
        MyColor mc = new MyColor();

        // カラーインスタンスの場合
        this.panel1.BackColor = mc.col;
    }
}

// カラー管理クラス
public class MyColor
{
    // 配列を扱ったプロパティ
    public int c { get; set; } = { 200, 120, 70 };

    // カラークラスを使ったプロパティ
    public Color col { get; set; } = Color.FromArgb(70, 150, 200);
}


配列のプロパティとColorクラス型のプロパティのどちらも大丈夫そうですね。

カラー値を取り出す際にはColorクラス型の方が楽ですが、値を設定ファイルに保存して次回起動時に反映させるのは配列型の方が楽ですかね。。

ということは、配列のプロパティとそのプロパティを利用してColorオブジェクトを生成するメソッドを用意するのが良いのかな?

という訳で下記のような感じで試してみたところ、こちらも問題ないようでした。
これなら呼び出すのは楽。。

▼呼び出し側 ボタンクリックイベント
this.panel1.BackColor = mc.MakeRGB();

▼クラス側
// 配列を扱ったプロパティ
public int color { get; set; } = { 200, 120, 70 };

// Colorオブジェクト生成メソッド
public Color MakeRGB(int i)
{
    Color c = Color.FromArgb(i[0], i[1], i[2]);
    return (c);
}

 
また、こんな風に set は配列だけど get は Color型‥みたいな書き方はできないのかな?
まだ知らないだけでできそう。

// set は配列だけど get はColor型‥はダメでした
public int c
{
    get { return (Color.FromArgb(this.c[0], this.c[1], this.c[2])); }
    set { this.c = value; }
}


何か分かったら追記予定。