2016-08-30 5 views
1

私の問題は以下の通りです:ディスプレイの表示色

私はこのような(Excelファイルから抽出された)ARGBコードで満たさコンボボックスがあります。

255, 149, 55, 39 
255, 0, 176, 80 
255, 0, 112, 192 
... 

を私の目標でありますrgbコードの代わりに色のリストを表示する。 だから、私は失敗し、これを実行しようとしました:

Private Sub CB_Color_DrawItem(ByVal sender As System.Object, ByVal e As DrawItemEventArgs) Handles CB_Color.DrawItem 

    If e.Index = -1 Then 
     Exit Sub 
    End If 

    Dim colBrush As Brush = New SolidBrush(Color.FromArgb(CB_Color.Items(e.Index))) 
    'Drawing rectangles for the color values 
    e.Graphics.DrawRectangle(New Pen(Brushes.Black), e.Bounds.Left + 2, 
         e.Bounds.Top + 2, 30, e.Bounds.Height - 5) 
    e.Graphics.FillRectangle(colBrush, e.Bounds.Left + 3, e.Bounds.Top + 3, 
         29, e.Bounds.Height - 6) 

End Sub 

このコードは何も変更しません。私はまだコンボボックスのリストにrbgコードを持っています。誰でもこのコードが間違っていると教えてもらえますか?

+0

Iは '描画する各色が' Color.FromArgb(CB_Color.Items(e.Index))で定義されているもの。ユーザーはドロップダウンリストから色を選択するだけで、選択したアイテムのインデックスを使用して彼が選んだものを知ることができたと思います。 – Elhendriks

答えて

3

いくつかの問題があります。前述のように、テキストが描画されていて、DrawItemコードが描画されていない場合、DrawModeはおそらくOwnderDrawFixedに設定されていません。

次に、アイテムの描画を処理すると、すべての図面を処理する必要があります。これには、選択項目のハイライト表示、背景とフォーカスの四角形が含まれます。描いた小さな色のボックスにもテキストが表示されるので、これで両方を行う方法が示されます。

Private Sub cbox1_DrawItem(sender As Object, e As DrawItemEventArgs) Handles cbox1.DrawItem 
    If e.Index = -1 Then Return 

    Dim thisText As String = cbox1.Items(e.Index).ToString() 
    Dim thisColor As Color = CType(TypeDescriptor.GetConverter(GetType(Color)). 
              ConvertFromInvariantString(thisText), 
              Color) 
    ' use HeighLight when needed 
    Dim foreclr As Color = If(e.State.HasFlag(DrawItemState.Selected), 
           SystemColors.HighlightText, 
           cbox1.ForeColor) 

    e.DrawBackground() 
    Using br As New SolidBrush(thisColor) 
     e.Graphics.DrawRectangle(New Pen(Brushes.Black), 
           e.Bounds.Left + 2, e.Bounds.Top + 2, 30, 
           e.Bounds.Height - 5) 
     e.Graphics.FillRectangle(br, e.Bounds.Left + 3, e.Bounds.Top + 3, 
        29, e.Bounds.Height - 6) 

     Dim tRect = New Rectangle(e.Bounds.Left + 32, e.Bounds.Top + 2, 
            e.Bounds.Width - 32, e.Bounds.Height - 4) 
     TextRenderer.DrawText(e.Graphics, String.Format("255, {0:000}, {1:000}, {2:000}", 
               thisColor.R, thisColor.G, thisColor.B), 
               cbox1.Font, tRect, foreclr) 
    End Using 

    e.DrawFocusRectangle() 

End Sub 

ARGB文字列の形式は、輸出とシリアライズのすべての種類で使用されているInvariantString形式であるように思われます。コードはそれを使用して変換する方法を示しますが、String.Splitも機能します。テキストから実際に色を作成するために選択を行うときには同じ操作を行う必要があります(または、すべてを上に移動してList(Of Color)を実行してください)

重要なことは、項目が選択したアイテムを選択し、描画するテキストに正しい正面色を使用します。 FocusRectangleも表示されます。

あり、テキストと色見本の両方の余地はあるが、あなたは本当にARGBテキストをしたくない場合は、単にDrawTextコードをスキップして、色で矩形全体を埋めるのではなくスウォッチを描く考える:

enter image description here

+0

これはうまくいきます!私はちょうど今テキストの選択された色のunsteadを表示する必要があります。 – Elhendriks

+0

バックカラーを設定するだけで済みますが、ここで解決方法が分かりません。 – Plutonix

+0

DropDownStyleのプロパティをDropDownListに変更し、Private Sub CB_Color_SelectedIndexChanged(ByVal送信者としてSystem.Object、ByVal e As System.EventArgs)を追加しました。CB_Color.SelectedIndexChangedを処理します。 Me.CB_Color.BackColor = Color。White End Sub'と表示され、ソリューションを壊すことなく正常に動作します。 – Elhendriks

2

まず、コンボボックスのプロパティで、「DrawMode」というプロパティを見つけます。この値を 'OwnerDrawFixed'に変更します。これは、コードまたはオペレーティングシステムが図面を処理するかどうかを示す値です。

その後、次のコードを追加して変更する必要があります。

Dim colorArray() As String = ComboBox1.Items(e.Index).ToString.Split(",") 

Dim colBrush As Brush = New SolidBrush(Color.FromArgb(CInt(colorArray(0)), CInt(colorArray(1)), CInt(colorArray(2)), CInt(colorArray(3)))) 

我々はこれを行うFromARGBが整数値のみを受け入れるためです。

関連する問題