1

カスタムチェックボックスを簡単に作成しようとしています。チェックされた状態で、すべてのチェックボックスの上に画像を描画したい。すべてのチェックボックスに対して単一のイベント ハンドラーを作成するにはどうすればよいですか? 多くのチェックボックスがあり、それぞれのイベント ハンドラーを記述したくありません。

    private void checkbox1_Paint(object sender, PaintEventArgs e)
    {
        Rectangle rect = new Rectangle(0, 0, 16, 16);
        if (checkbox1.Checked)
        {
            e.Graphics.DrawImage(Properties.Resources.checkbox_checked, rect);
        }
        else
        {
            e.Graphics.DrawImage(Properties.Resources.checkbox_unchecked, rect);
        }
    }
    private void checkbox2_Paint(object sender, PaintEventArgs e)
    {
        Rectangle rect = new Rectangle(0, 0, 16, 16);
        if (checkbox2.Checked)
        {
            e.Graphics.DrawImage(Properties.Resources.checkbox_checked, rect);
        }
        else
        {
            e.Graphics.DrawImage(Properties.Resources.checkbox_unchecked, rect);
        }
    }
    // etc...
4

4 に答える 4

4

このハンドラーをすべてのチェックボックスに割り当てます。 イベントをトリガーしたコントロールを取得するためにキャストsenderする方法に注目してください。CheckBox

private void checkbox_Paint(object sender, PaintEventArgs e)
{
    var checkbox = sender as CheckBox // Here you get the current checkbox
    Rectangle rect = new Rectangle(0, 0, 16, 16);
    if (checkbox.Checked)
    {
        e.Graphics.DrawImage(Properties.Resources.checkbox_checked, rect);
    }
    else
    {
        e.Graphics.DrawImage(Properties.Resources.checkbox_unchecked, rect);
    }
}
于 2013-03-28T13:36:44.143 に答える
1

同じメソッドを何度でも使用できます。Paint イベントで (デザイナーまたはコードから) 割り当てるだけです。

現在のチェックボックスを取得するには、送信者をチェックボックスにキャストします。

private void checkbox1_Paint(object sender, PaintEventArgs e)
{
CheckBox chk = sender as CheckBox;
..
}
于 2013-03-28T13:36:24.007 に答える
1

これはコンテキストに基づいた Windows フォームだと思いますか?

それぞれを選択しcheckbox(フォーム デザイナーで複数選択できます)、パネルの稲妻をクリックしProperties、Paint イベントを見つけてcheckbox1_Paint 、そこにメソッド名: を入力します。

于 2013-03-28T13:36:38.717 に答える
0

私は実際に自分で答えを見つけました。プログラムで行われるため、ペイント イベントをすべてのチェックボックスに手動で割り当てるよりも簡単です。

public void SetAllCheckboxes(Control where)
{
    foreach (Control control in where.Controls)
    {
        if (control.GetType().Name == "CheckBox")
            control.Paint += new PaintEventHandler(this.checkbox_Paint);
        else if (control.Controls.Count > 0)
            SetAllCheckboxes(control);
    }
}

そしてそれを呼び出すだけです:

SetAllCheckboxes(this);
于 2013-03-28T14:26:56.150 に答える