ComboBoxの選択されたアイテムのForeColorを変更する方法は?

.net-4.0 c# combobox winforms
ComboBoxの選択されたアイテムのForeColorを変更する方法は?

選択した(ドロップダウンではない!)アイテムの外観を変更することはできますか?

combobox.ForeColorは、すべてのアイテムのテキストの色のみをドロップダウンリストに変更します。

*編集:*バリアントは次のとおりです。

 public static void CBoxDrawItem(object sender, DrawItemEventArgs args)
    {
        var box = sender as ComboBox;
        if (box == null || args.Index < 0 || args.Index >= box.Items.Count)
            return;

        e.DrawBackground();
        var data = box.Tag as ControlData;
        var color = (args.State & DrawItemState.ComboBoxEdit) == 0 || data == null || !data.IsInDefaultState
            ? e.ForeColor : GetDefaultColor(e.ForeColor);
        using (var brush = new SolidBrush(color))
        {
            args.Graphics.DrawString(box.Items[args.Index].ToString(), args.Font, brush, args.Bounds.X, args.Bounds.Y);
        }
        args.DrawFocusRectangle();
    }

  5  2


ベストアンサー

この作業を行うために、 `FlatStyle`をPopupまたはFlatに変更する必要はありません。 そもそも、これらのスタイルは、アプリケーションの残りのインターフェイスと比較すると、非常にreallyいように見える傾向があるため、そもそもそうしたくないでしょう。 ネイティブWindowsコントロールは3Dスタイルの外観を使用します。 FlatおよびPopupスタイルは、WebまたはWindows Mobileアプリケーション向けに設計されており、より適しています。

コンボボックスに表示されるテキストの前景色を変更するコードをすでに書いているが、Windows Vista以降では機能しないことに気付いたので、この質問をしていると思います。 これは、コンボボックスの DropDownList`スタイルがWindowsのこれらのバージョンのボタンのように見えるように変更されたときに、カスタムテキストカラーのサポートも失われたためです。 代わりに、選択されたテキストは常に標準の「ウィンドウテキスト」色で表示されます。 `DropDownList`スタイルを通常の DropDown`スタイルコンボボックスと比較します。

image:https://i.stack.imgur.com/zCO70.png [Windows Vista以降でのDropDownListスタイルとDropDownスタイルの比較]

視覚的には、2つのコンボボックスは以前のバージョンのWindowsでは同じように見えますが、Vista以降では同じではありません。 *カスタムの前景色を表示するには、コンボボックスのhttp://msdn.microsoft.com/en-us/library/system.windows.forms.combobox.dropdownstyle.aspx [DropDownStyle`プロパティ]を変更することが重要です`DropDown *に制御します(これは実際にはデフォルトです)。

また、http://msdn.microsoft.com/en-us/library/system.windows.forms.combobox.flatstyle.aspx [FlatStyle property]を` System`に設定して、気の利いたすべてのネイティブのWindowsコントロールが提供するフェードインおよびフェードアウト効果。 「標準」スタイルは、マネージコードでこれらの効果をエミュレートしようとしますが、まったく適切な感じがありません。 私はささいなことを気にします。

その後、次のコードを使用できます(Adrianの回答で最初に提案されたとおり)。

public Form1()
{
   InitializeComponent();

   // Set custom combobox styles
   comboBox1.DropDownStyle = ComboBoxStyle.DropDown;
   comboBox1.FlatStyle = FlatStyle.System;

   // Attach relevant event handler methods
   comboBox1.DropDown += new EventHandler(comboBox1_DropDown);
   comboBox1.DropDownClosed += new EventHandler(comboBox1_DropDownClosed);
}

void comboBox1_DropDown(object sender, EventArgs e)
{
   // Optionally, revert the color back to the default
   // when the combobox is dropped-down
   //
   // (Note that we're using the ACTUAL default color here,
   //  rather than hard-coding black)
   comboBox1.ForeColor = SystemColors.WindowText;
}

void comboBox1_DropDownClosed(object sender, EventArgs e)
{
   // Change the color of the selected text in the combobox
   // to your custom color
   comboBox1.ForeColor = Color.Red;
}

次の効果を生み出すには:

image:https://i.stack.imgur.com/Nlv0V.png [選択したテキストを赤色で表示するコンボボックス]

9


コンボボックスのFlatStyleをPopupまたはFlatに変更できる場合、ForeColorを変更すると、選択したアイテムの色も変更されます。

画像:https://i.stack.imgur.com/rYGJI.png [スクリーンショット]

選択したアイテムの色のみを変更するには、何らかの回避策を実装し、DropDownを開いたり閉じたりするたびにForeColorを変更します。

コードサンプル:

 public Form1()
    {
        InitializeComponent();

        comboBox1.FlatStyle = FlatStyle.Popup;

        comboBox1.DropDown += new EventHandler(comboBox1_DropDown);
        comboBox1.DropDownClosed += new EventHandler(comboBox1_DropDownClosed);
    }

    void comboBox1_DropDownClosed(object sender, EventArgs e)
    {
        comboBox1.ForeColor = Color.Red;
    }

    void comboBox1_DropDown(object sender, EventArgs e)
    {
        comboBox1.ForeColor = Color.Black;
    }

4


Cody Grayの提案を使用して、同じDropDownListスタイルの動作を持つように追加できます。

private void comboBox1_KeyPress(object sender, KeyPressEventArgs e)
{
    e.Handled = true;
}

この方法では、ユーザーはコンボボックスを編集できません。

1


タイトルとURLをコピーしました