none
Windows7とデータベースグリッドなどのコンボボックスを選択状態にすると見づらい RRS feed

  • 質問

  • C#で、データベースグリッド(・・に限らないのですが)
    実行時、コンボボックスなどをドラッグして選択状態にとしうとすると
    XPでは背景が青くなり選択状態になっていることが一目でわかるのですが、
    Windows7では見た目がほとんど変わらず見づらくてかないません

    Windows7でコンボボックスが現在選択状態であると言うことを一目でわからせるために、どのような画面効果がふさわしいでしょう(しかしXPで実行出来ないと困るのです)

    2011年2月13日 8:14

回答

  • はじめまして。

    コンボボックスの選択状態時の青色は、”強調色”のことですよね。

    これは、自分でコンボボックスの描画処理を実装すれば実現できます。

    ただし、システムの設定色(HighLight)を無視していいかどうかは、仕様の確認が必要と思われます。

    一番簡単なのは、Windows7上で、クラシックモードで動かしてもらう事です。

     

    <コーディングによる対策>

     

    1. コンボボックス(ここでは、"comboBox1"とします)のプロパティのうち「DrawMode」を「OwnerDrawFixed」に設定する。
    2. コンボボックスのイベント処理(DrawItemイベント)を以下の様な感じで実装すると出来ると思われます。

     

     

     

    private void comboBox1_DrawItem(object sender, DrawItemEventArgs e)
    {
     //背景色を白色で塗りつぶす
     e.Graphics.Clear(Color.White);
    
     if (comboBox1.Focused == true)
     {
      //強調色(水色)で塗りつぶし
      e.Graphics.FillRectangle(new SolidBrush(Color.LightBlue), e.Bounds);
      //フォーカスを示す四角形を描画
      e.DrawFocusRectangle();
     }
    
     //文字列の描画
     using (Font oFont = comboBox1.Font.Clone() as Font)
     {
      if (e.Bounds.Y == 3) //こうやれば出来るが、ここらへんはどうするか検討必要
      {
       e.Graphics.DrawString(
        comboBox1.Items[e.Index] as string, oFont, Brushes.Black, e.Bounds);
      }
      else
      {
       for (int i = 0; i < comboBox1.Items.Count; i++)
       {
        e.Graphics.DrawString(
         comboBox1.Items[i] as string, oFont, Brushes.Black, e.Bounds.X, e.Bounds.Height * i);
       }
      }
     }
    }
    

     

    見て分かる通り、単に、描画をするだけなのですが、後は、お好きなように、

    線なり、四角なり、いろいろ好みに応じて描画すれば自分だけのオリジナルコンボボックスが完成です。

    参考下さい。

    • 回答の候補に設定 Keidome 2011年2月23日 12:03
    • 編集済み Keidome 2011年2月23日 12:04 脱字
    • 回答としてマーク いちろう 2011年2月27日 13:04
    2011年2月23日 12:03

すべての返信

  • はじめまして。

    コンボボックスの選択状態時の青色は、”強調色”のことですよね。

    これは、自分でコンボボックスの描画処理を実装すれば実現できます。

    ただし、システムの設定色(HighLight)を無視していいかどうかは、仕様の確認が必要と思われます。

    一番簡単なのは、Windows7上で、クラシックモードで動かしてもらう事です。

     

    <コーディングによる対策>

     

    1. コンボボックス(ここでは、"comboBox1"とします)のプロパティのうち「DrawMode」を「OwnerDrawFixed」に設定する。
    2. コンボボックスのイベント処理(DrawItemイベント)を以下の様な感じで実装すると出来ると思われます。

     

     

     

    private void comboBox1_DrawItem(object sender, DrawItemEventArgs e)
    {
     //背景色を白色で塗りつぶす
     e.Graphics.Clear(Color.White);
    
     if (comboBox1.Focused == true)
     {
      //強調色(水色)で塗りつぶし
      e.Graphics.FillRectangle(new SolidBrush(Color.LightBlue), e.Bounds);
      //フォーカスを示す四角形を描画
      e.DrawFocusRectangle();
     }
    
     //文字列の描画
     using (Font oFont = comboBox1.Font.Clone() as Font)
     {
      if (e.Bounds.Y == 3) //こうやれば出来るが、ここらへんはどうするか検討必要
      {
       e.Graphics.DrawString(
        comboBox1.Items[e.Index] as string, oFont, Brushes.Black, e.Bounds);
      }
      else
      {
       for (int i = 0; i < comboBox1.Items.Count; i++)
       {
        e.Graphics.DrawString(
         comboBox1.Items[i] as string, oFont, Brushes.Black, e.Bounds.X, e.Bounds.Height * i);
       }
      }
     }
    }
    

     

    見て分かる通り、単に、描画をするだけなのですが、後は、お好きなように、

    線なり、四角なり、いろいろ好みに応じて描画すれば自分だけのオリジナルコンボボックスが完成です。

    参考下さい。

    • 回答の候補に設定 Keidome 2011年2月23日 12:03
    • 編集済み Keidome 2011年2月23日 12:04 脱字
    • 回答としてマーク いちろう 2011年2月27日 13:04
    2011年2月23日 12:03
  • ありがとうございます。 >>コンボボックスの選択状態時の青色は、”強調色”のことですよね。 全く持ってその通りです 直接Drawの中で書き換えますか うーん・・・XPでは標準のままで何とかなってるので・・・ あまり手を加えたくないんですが とりあえず試してみます
    2011年2月27日 13:04
  • 私も先日コンボボックスの仕様が変わったことを知って、大慌てで対応したのですが、
    Vista以降の場合だけ処理するようにしました。
    こんな感じでやりました。
    // OSの情報を取得
     OperatingSystem osInfo = Environment.OSVersion;
    
    // Vista以降の見た目をなんとかする
     if (osInfo.Version.Major >= 6)
     {
     ......
    
    参考になれば幸いです。
    2011年2月28日 2:33