Размер шрифта выбранного элемента Windows.Forms.Listbox меняется - PullRequest
0 голосов
/ 04 января 2011

Я унаследовал от Windows.Forms.Listbox, чтобы я мог переопределить методы OnPaint и OnDrawItem, чтобы выделить определенные элементы и альтернативные фоновые цвета.

Я также пропускаю некоторые события DrawItem для предотвращения мерцания.
Все работает нормально, однако, когда я выбираю элементы в списке, кажется, что шрифт уменьшается или становится более сжатым.
Тогдакогда я щелкаю мышью, шрифт возвращается к своему нормальному размеру и внешнему виду, но те же самые элементы все еще выбраны (что правильно).Во время отладки шрифт никогда не изменяется и не изменяет свои свойства, но в итоге он выглядит иначе, когда элемент выбран и событие mousedown только что произошло.

Есть идеи?

Public Sub New(ByVal relativityHighlightColor As System.Drawing.Color)
            _relativityHighlightColor = relativityHighlightColor
            Me.SetStyle( _
             System.Windows.Forms.ControlStyles.OptimizedDoubleBuffer Or System.Windows.Forms.ControlStyles.ResizeRedraw Or System.Windows.Forms.ControlStyles.UserPaint, True)
            Me.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed
            Me.IntegralHeight = False
        End Sub

        Protected Overrides Sub OnDrawItem(ByVal e As System.Windows.Forms.DrawItemEventArgs)
            Dim rowBackColor As System.Drawing.Color = If(Me.AlternateColors AndAlso e.Index Mod 2 = 1, System.Drawing.Color.LightGray, e.BackColor)
            Dim newArgs As System.Windows.Forms.DrawItemEventArgs = e
            If Me.Items.Count > 0 Then
                newArgs = New System.Windows.Forms.DrawItemEventArgs(e.Graphics, e.Font, Me.GetItemRectangle(e.Index), e.Index, e.State, e.ForeColor, rowBackColor)
                newArgs.DrawBackground()
                newArgs.Graphics.DrawString(Me.Items(e.Index).ToString(), newArgs.Font, New System.Drawing.SolidBrush(If(newArgs.Index = _highlightIndex, Me.MyHighlightColor, newArgs.ForeColor)), New System.Drawing.PointF(e.Bounds.X, e.Bounds.Y))
            End If
            MyBase.OnDrawItem(newArgs)
        End Sub

        Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
            Dim region As New System.Drawing.Region(e.ClipRectangle)
            e.Graphics.FillRegion(New System.Drawing.SolidBrush(Me.BackColor), region)
            If Me.Items.Count > 0 Then
                For i As Int32 = 0 To Me.Items.Count - 1 Step 1
                    Dim rect As System.Drawing.Rectangle = Me.GetItemRectangle(i)
                    If (e.ClipRectangle.IntersectsWith(rect)) Then
                        If ((Me.SelectionMode = System.Windows.Forms.SelectionMode.One AndAlso Me.SelectedIndex = i) OrElse (Me.SelectionMode = System.Windows.Forms.SelectionMode.MultiSimple AndAlso Me.SelectedIndices.Contains(i)) OrElse Me.SelectionMode = System.Windows.Forms.SelectionMode.MultiExtended AndAlso Me.SelectedIndices.Contains(i)) Then
                            OnDrawItem(New System.Windows.Forms.DrawItemEventArgs(e.Graphics, Me.Font, rect, i, System.Windows.Forms.DrawItemState.Selected, Me.ForeColor, Me.BackColor))
                        Else
                            OnDrawItem(New System.Windows.Forms.DrawItemEventArgs(e.Graphics, Me.Font, rect, i, System.Windows.Forms.DrawItemState.Default, Me.ForeColor, Me.BackColor))
                        End If
                        region.Complement(rect)
                    End If
                Next
            End If
            MyBase.OnPaint(e)
        End Sub

1 Ответ

0 голосов
/ 04 января 2011

Обработка OnSelectionIndexChanged и вызов метода Refresh.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...