Нарисовать галочку в соответствии с размером поля?

Введение

Я пишу простой пользовательский элемент управления флажком, который будет рисовать фон и галочку в пользовательском цвете.

Чтобы нарисовать галочку, я делаю так:

    ''' <summary>
    ''' Draws the checkbox tick.
    ''' </summary>
    ''' <param name="g">The drawing surface.</param>
    ''' <param name="rect">The box rectangle.</param>
    ''' <param name="checkState">The checkbox state.</param>
    Private Sub DrawTick(ByVal g As Graphics,
                         ByVal rect As Rectangle,
                         ByVal checkState As CheckState)

        Select Case checkState

            Case checkState.Checked

                Dim points As PointF() =
                    New PointF() {
                        New PointF(rect.X + 3, rect.Y + 5),
                        New PointF(rect.X + 5, rect.Y + 7),
                        New PointF(rect.X + 9, rect.Y + 3),
                        New PointF(rect.X + 9, rect.Y + 4),
                        New PointF(rect.X + 5, rect.Y + 8),
                        New PointF(rect.X + 3, rect.Y + 6),
                        New PointF(rect.X + 3, rect.Y + 7),
                        New PointF(rect.X + 5, rect.Y + 9),
                        New PointF(rect.X + 9, rect.Y + 5)
                    }

                Using checkPen As New Pen(Me.TickColor, 1)
                    g.DrawLines(checkPen, points)
                End Using

            Case checkState.Indeterminate

                Using checkBrush As New SolidBrush(Me.TickColor)

                    g.FillRectangle(checkBrush, New Rectangle(rect.X + 3,
                                                              rect.Y + 3,
                                                              rect.Width - 5,
                                                              rect.Height - 5))
                End Using

            Case checkState.Unchecked
                ' Do Nothing.

        End Select

    End Sub

Вот результат:

введите здесь описание изображения


Проблема

Проблема в том, что размер/точки галочки указаны в соответствии с размером флажка по умолчанию, я понял основную идею из этой статьи:

Поддержка True Transparency для Элемент управления .NET CheckBox

Итак, скажем, я увеличиваю поле флажка (ширина и высота rect var кода выше), тогда он нарисует крошечную галочку, как это:

введите здесь описание изображения


Вопрос

Как я могу динамически изменить арифметику, которую я делаю с точками в методе DrawTick, чтобы исправить размер деления для других размеров ящика?


person ElektroStudios    schedule 04.05.2015    source источник


Ответы (1)


Вам нужен масштабный коэффициент, чтобы определить, насколько увеличить каждую координату «x» и «y». Вот пример (при условии, что ширина флажка по умолчанию составляет 12 пикселей, что является всего лишь предположением):

    Dim scaleFactor As Single = CType(rect.Width, Single) / 12.0
    Dim points As PointF() =
        New PointF() {
            New PointF(rect.X + scaleFactor * 3, rect.Y + scaleFactor * 5),
            New PointF(rect.X + scaleFactor * 5, rect.Y + scaleFactor * 7),
            New PointF(rect.X + scaleFactor * 9, rect.Y + scaleFactor * 3),
            New PointF(rect.X + scaleFactor * 9, rect.Y + scaleFactor * 4),
            New PointF(rect.X + scaleFactor * 5, rect.Y + scaleFactor * 8),
            New PointF(rect.X + scaleFactor * 3, rect.Y + scaleFactor * 6),
            New PointF(rect.X + scaleFactor * 3, rect.Y + scaleFactor * 7),
            New PointF(rect.X + scaleFactor * 5, rect.Y + scaleFactor * 9),
            New PointF(rect.X + scaleFactor * 9, rect.Y + scaleFactor * 5)
        }
person Rajeev Goel    schedule 04.05.2015