DOBON.NET DOBON.NETプログラミング掲示板過去ログ

ComboBoxの項目にDashStyleの異なるラインを描画したいです。

環境/言語:[言語 : C#]
分類:[.NET]

【解決したい問題】

ComboBoxの項目にラインを引こうとしましたが、
同一DashStyleのラインばかりが引けてしまいます。
異なるDashStyleのラインを1つのComboBoxのItemに描画するには
どのようにすればよいでしょうか?

# WordやExcelの「オートシェイプの書式設定」ダイアログにある
# 「実践/点線」のようなComboBoxを作ろうとしましたが
# うまくいきませんでした。

【解決するために何をしたか】

Googleで検索して、こちらの「ComboBoxの項目を自分で描画する」を参照して
自分でテストモジュールを組んでみましたが
冒頭にも書いたように、同一DashStyleのラインばかりが描画されてしまいます。
> 同一DashStyleのラインばかりが引けてしまいます。

 項目毎に異なる DashStyle を用いていない‥‥というわけではないのでしょうか?
 どのようなコードを試されたか判りませんけれど、 DrawItemEventArgs の値に応じた描画を行っていないだけのような気がします。
>深山さん
ご回答ありがとうございます。

>  どのようなコードを試されたか判りませんけれど、 DrawItemEventArgs の値に応じた描画を行っていないだけのような気がします。

この一文の通りです。
どぼん!さんが作成されたsrcの意味を完全には理解し切れていません。
ちなみに私が記述したコードは

private void ComboBox1_DrawItem(object sender, System.Windows.Forms.DrawItemEventArgs e)
{
 //背景描画
 e.DrawBackground();

 ComboBox cmb = (ComboBox) sender;

 Pen pn = new Pen(Color.Black, 1);

 //ComboBoxに格納する線種
 DashStyle[] d_styles = {
       DashStyle.Solid,
       DashStyle.Dot,
       DashStyle.Dash,
       DashStyle.DashDot,
       DashStyle.DashDotDot};

 //ライン描画開始位置・終了位置を設定
 Point ptStart = new Point(e.Bounds.X + 2, e.Bounds.Y + (cmb.Size.Height / 2));
 Point ptEnd = new Point(e.Bounds.X + cmb.Size.Width - 10, e.Bounds.Y + (cmb.Size.Height / 2));

 for (int i = 0; i < d_styles.Length - 1; i++)
 {
  //描画
  pn.DashStyle = d_styles[i];
  e.Graphics.DrawLine(pn, ptStart, ptEnd);
 }

 //終了処理
 e.DrawFocusRectangle();
 pn.Dispose();
}

private void Form07_Load(object sender, System.EventArgs e)
{
 DashStyle[] d_styles = {
        DashStyle.Solid,
        DashStyle.Dot,
        DashStyle.Dash,
        DashStyle.DashDot,
        DashStyle.DashDotDot};

 //描画
 for (int i = 0; i < d_styles.Length - 1; i++)
 {
  this.comboBox1.Items.Add(d_styles[i]);
 }
 
}

以上の通りです。長々と申し訳ありません。
自分では Form07_Load() 内の記述が誤っているんだろうと思います。
正しいコードをご存知の方がいらっしゃいましたらご教授ください。
よろしくお願いします。
#回答ではありません。

> 自分では Form07_Load() 内の記述が誤っているんだろうと思います。

 えーっと‥‥(^_^;)

 そう思われた根拠はどこにあるのでしょうか?
 一度試しに DrawMode プロパティを Normal にして実行してみてはどうでしょう。意図した内容がリストに追加されていませんか?

> どぼん!さんが作成されたsrcの意味を完全には理解し切れていません。
とのことですが、 DrawItem イベントの発生するタイミングを把握されていないが故のように感じられました。
 DrawItem イベントは、描画が必要な『項目毎』に発生します。 ComboBox1_DrawItem 内に以下のようなコードを加えて動作させてみてください。理解の助けになるかと思います。

Console.WriteLine("{0}:{1}", e.Index, e.Bounds);
>深山さん
早くのレス、ありがとうございました。

> 一度試しに DrawMode プロパティを Normal にして実行してみてはどうでしょう。

試してみたところ、仰った通りに
DashStyleのメンバ名がComboBoxに格納されていました。
これは Form07_Load() 内で指定したDashStyleの配列が
DrawItem()に渡っている、という理解でよろしいでしょうか?

> DrawItem イベントは、描画が必要な『項目毎』に発生します。
(以下略)

なるほど!
その事が全く理解できていませんでした。

お陰で思ったようなComboBoxを作成できました。
内容のわかりにくい質問に丁寧にご回答いただき、ありがとうございました。
心より御礼申し上げます。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板