4

おい。ComboBox のハイライターに問題があります。最近、 ComboBox 内の特定の項目をグレー表示にする必要がありましたが、 ComboBoxに文字列を手動で (プログラム的に) 描画することでそれを行いました。DrawMode.NORMALの下の .NET コンボボックスでは、矢印をクリックするとライターが自動的に表示され、ハイライターの背景色はデフォルトでキンナ ブルーになります。問題は、アイテムの上にマウスを移動すると、ホバーしたアイテムの前色が白に変わりますが、アイテムを手動で描画すると ( DrawMode.OwnerDrawVariable )、機能しません。これで私を助けてもらえますか??

これは私がアイテムをグレーアウトする方法です、

private void comboBox1_DrawItem(object sender, DrawItemEventArgs e)
{
    e.DrawBackground();
    int index = e.Index;
    CombinationEntry aFunction = comboBox1.Items[index] as CombinationEntry;  //CombinationEntry is a custom object to hold the gray info. Gray if not available and black if available
    if (aFunction.myIsAvailable)
    {
        e.Graphics.DrawString(aFunction.ToString(), new Font("Arial", 10, FontStyle.Regular, GraphicsUnit.Pixel), Brushes.Black, new Point(e.Bounds.X, e.Bounds.Y));
    }
    else
    {
        e.Graphics.DrawString(aFunction.ToString(), new Font("Arial", 10, FontStyle.Regular, GraphicsUnit.Pixel), Brushes.Gray, new Point(e.Bounds.X, e.Bounds.Y));
    }
}
4

3 に答える 3

5

デフォルトでは、ComboBox 内のテキストは次の 2 つの色のいずれかで描画されます。

SystemColors.WindowText

ハイライトされていないアイテムの場合、または

SystemColors.HighlightText

ハイライトされたアイテム用。

これらの色は固定されていませんが、ユーザーが (たとえば、コントロール パネルを使用して) 構成できます。一般的な Windows 配色では、WindowText は黒で、HighlightText は白ですが、配色が再構成されている場合は、常にそうとは限りません。

ユーザーがシステムをどのように構成しているかに関係なく適切な色を取得し、強調表示されたテキストと強調表示されていないテキストに適切な色を取得するには、無効になっていないテキストに Brushes.Black を使用する代わりに、次のようなものを使用します。 :

e.State == DrawItemState.Selected ?
    SystemBrushes.HighlightText : SystemBrushes.WindowText

これは基本的に、描画しているアイテムの状態 (e.State) が Selected (強調表示) の場合は SystemColors.HighlightText を使用し、それ以外の場合は SystemColors.WindowText を使用します。

以下を使用することもできます。

SystemBrushes.GrayText

Brushes.Gray の代わりに、ユーザーが非標準の配色を使用していて、単純なグレーが正しく表示されない場合に使用します。また、おそらく次のものも使用する必要があります。

comboBox1.Font

Arial フォントを作成する代わりに、フォントがフォームの ComboBox に定義されたフォントと一致することを確認します。(また、Font オブジェクトを作成し、それを破棄しないと、リソース リークが発生します。)

于 2008-12-08T16:11:15.313 に答える
0

if ((e.State & DrawItemState.Selected) == DrawItemState.Selected)e.State == DrawItemState.Selectedすべての可能性をカバーしようとするよりも優れている

于 2011-05-12T14:48:42.740 に答える
0

うん。それは本当に役に立ちました。また、私はやろうとしました:

if (e.State == ((DrawItemState.NoAccelerator | DrawItemState.NoFocusRect) | 
                (DrawItemState.Selected | 
                 DrawItemState.NoAccelerator | 
                 DrawItemState.NoFocusRect)))
{
    e.Graphics.DrawString(aFunction.ToString(), 
                          new Font("Arial", 10, FontStyle.Regular,
                                   GraphicsUnit.Pixel), 
                          SystemBrushes.HighlightText, 
                          new Point(e.Bounds.X, e.Bounds.Y));
}

それは私が期待したものを私に与えました。ソリッドブラシではなくシステムブラシを使用することについてのあなたの提案を明確に検討します. 解決策をありがとう。

于 2008-12-09T03:20:51.467 に答える