PGから色を指定できる仕様にして欲しいとの依頼。
Configファイルでの指定では駄目らしい。
うむ。めんどくさい。
ColorDialogを出しても良いけど、色指定が微妙。
簡単に指定が良いなぁ・・・
で、ネットを検索して、コンボボックスを自分で描写する事に。
以下がそのソース
コンボボックスの継承クラスです。
################### ソースここから #################
Imports System.ComponentModel
''' <summary>
''' 色選択コンボボックス
''' </summary>
Public Class ColorComboBox
Inherits System.Windows.Forms.ComboBox
#Region "内部変数"
''' <summary>カラー色表示</summary>
Private _DispColorName As Boolean = True
''' <summary>サンプル文字</summary>
Private _SampleString As String = ""
#End Region
#Region "プロパティ"
''' <summary>
''' カラー色表示
''' </summary>
<Category("表示")> _
<Description("色名の表示設定")> _
Public Property DispColorName() As Boolean
Get
Return _DispColorName
End Get
Set(ByVal value As Boolean)
_DispColorName = value
End Set
End Property
''' <summary>
''' サンプル文字
''' </summary>
<Category("表示")> _
<Description("色指定でのサンプル文字")> _
Public Property SampleString() As String
Get
Return _SampleString
End Get
Set(ByVal value As String)
_SampleString = value
End Set
End Property
#End Region
#Region "コンストラクタ"
''' <summary>
''' コンストラクタ
''' </summary>
Public Sub New()
MyBase.New()
'固定プロパティ
Me.DrawMode = Windows.Forms.DrawMode.OwnerDrawFixed
Me.DropDownStyle = ComboBoxStyle.DropDownList
'色設定
Me.Items.Clear()
For Each col As KnownColor In [Enum].GetValues(GetType(KnownColor))
Me.Items.Add(Color.FromName(col.ToString))
Next
End Sub
#End Region
#Region "イベント"
''' <summary>
''' 行描写
''' </summary>
Protected Overrides Sub OnDrawItem(ByVal e As System.Windows.Forms.DrawItemEventArgs)
'領域
Dim rCol As RectangleF
Dim rText As RectangleF
Dim rTextBack As RectangleF
If DispColorName Then
'色名あり
Dim rWid As Single = 30
If rWid > CSng(e.Bounds.Width * 0.9) Then
rWid = CSng(e.Bounds.Width * 0.9)
End If
rCol = New RectangleF(e.Bounds.Left, e.Bounds.Top, rWid, e.Bounds.Height)
If (rWid + 10) > e.Bounds.Width Then
rWid = 0
Else
rWid = 10
End If
rText = New RectangleF(rCol.Right + rWid, e.Bounds.Top, e.Bounds.Width, e.Bounds.Height)
rTextBack = New RectangleF(rCol.Right, e.Bounds.Top, e.Bounds.Width, e.Bounds.Height)
Else
'色名なし
rCol = New RectangleF(e.Bounds.Left, e.Bounds.Top, e.Bounds.Width, e.Bounds.Height)
rText = New RectangleF(e.Bounds.Left, e.Bounds.Top, e.Bounds.Width, e.Bounds.Height)
rTextBack = New RectangleF(rCol.Right, e.Bounds.Top, e.Bounds.Width, e.Bounds.Height)
End If
If e.Index >= 0 Then
'外枠
Using brush As New SolidBrush(Me.BackColor)
e.Graphics.FillRectangle(brush, rTextBack)
End Using
'選択色
Dim objColor As Color = DirectCast(Me.Items(e.Index), Color)
If DispColorName Then
'色名称
Dim txt As String = objColor.ToKnownColor.ToString
Dim fmt As StringFormat = CType(StringFormat.GenericDefault.Clone, StringFormat)
fmt.Alignment = StringAlignment.Near
fmt.LineAlignment = StringAlignment.Center
Using brush As New SolidBrush(Me.ForeColor)
e.Graphics.DrawString(txt, e.Font, brush, rText, fmt)
End Using
End If
'色枠
Using backBrush As New SolidBrush(objColor)
e.Graphics.FillRectangle(backBrush, rCol)
End Using
'サンプル文字
Dim Samplefmt As StringFormat = CType(StringFormat.GenericDefault.Clone, StringFormat)
Samplefmt.Alignment = StringAlignment.Center
Samplefmt.LineAlignment = StringAlignment.Center
Using brush As New SolidBrush(Me.ForeColor)
e.Graphics.DrawString(Me.SampleString, e.Font, brush, rCol, Samplefmt)
End Using
End If
End Sub
#End Region
End Class
################### ソースここまで #################
プロパティを2つほど追加しています。
DispColorName 色名称の表示ON/OFF
SampleString 色にかぶせるサンプル文字
で、設定・取得は SelectItem を使用(colorオブジェクトでね)
いつもの通り、即席での作成です。
バグ等があるやも知りませんがwww
0 件のコメント:
コメントを投稿