Удалить границу в фокусе из кнопки управления - PullRequest
4 голосов
/ 14 мая 2010

Я устанавливаю свойства элемента управления Winforms Button так, чтобы гиперссылка отображалась на веб-странице.Я отформатировал все хорошо, кроме границы в объекте FlatAppearance.У меня есть код, чтобы действовать как псевдо-CSS (FormBackColor является строковой константой.): ​​

b.FlatStyle = FlatStyle.Flat
b.BackColor = ColorTranslator.FromHtml(FormBackColor) 
b.ForeColor = Color.Blue
b.Font = New Font(b.Font.FontFamily, b.Font.Size, FontStyle.Underline)
b.Cursor = Cursors.Hand

Dim fa As FlatButtonAppearance = b.FlatAppearance
fa.BorderSize = 0
fa.MouseOverBackColor = b.BackColor
fa.MouseDownBackColor = b.BackColor

AddHandler b.MouseEnter, AddressOf ButtonMouseOver
AddHandler b.MouseLeave, AddressOf ButtonMouseOut

Вот функции мыши над / над, как ссылка на то, что происходит:

Public Shared Sub ButtonMouseOver(ByVal sender As Object, ByVal e As EventArgs)

    Dim b As Button = DirectCast(sender, Button)

    Dim fa As FlatButtonAppearance = b.FlatAppearance
    fa.BorderSize = 1

End Sub

Public Shared Sub ButtonMouseOut(ByVal sender As Object, ByVal e As EventArgs)

    Dim b As Button = DirectCast(sender, Button)

    Dim fa As FlatButtonAppearance = b.FlatAppearance
    fa.BorderSize = 0

End Sub

Код удаляет границу из плоского элемента управления Button, за исключением MouseOver, где я добавляю границу в 1 пиксель.На MouseLeave я удаляю границу.Это должно показать некоторую визуальную обратную связь.Это прекрасно работает, когда кнопка не имеет фокуса.Однако, если я нажму на кнопку, наведя фокус на кнопку, то при наведении мыши на нее снова и снова будет отображаться граница больше 1 пикселя вокруг кнопки.Я представляю себе, что он объединяет явную границу 1 пикселя моей кнопки с традиционной рамкой «Кнопка Winform имеет фокус, поэтому добавьте рамку» вокруг кнопки.

Как отключить / удалить «Кнопка Winform имеетфокус, так что добавить границы "границы?Или я должен просто выполнить проверку в ButtonMouseOver, чтобы проверить, имеет ли элемент управления фокус, являющийся условием добавления границы, и просто покончим с этим?Я бы предпочел убрать автоматическую рамку из фокуса по любой причине:)

Ответы [ 3 ]

4 голосов
/ 14 мая 2010

Вы можете переопределить событие OnPaint кнопки и заново закрасить нарисованную границу цветом фона формы:

AddHandler Button1.Paint, AddressOf ButtonPaint

Private Sub ButtonPaint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs)
    Dim Btn = DirectCast(sender, Button)
    Using P As New Pen(Me.BackColor)
        e.Graphics.DrawRectangle(P, 1, 1, Btn.Width - 3, Btn.Height - 3)
    End Using
End Sub
2 голосов
/ 24 марта 2012

Еще один способ сделать это для наследования класса Windows.Forms.Button и переопределения событий. Это предотвращает необходимость обработки этих событий для каждой кнопки в вашей основной программе.

Public Class BorderlessFlatButton
    Inherits Windows.Forms.Button

Protected Overrides Sub OnCreateControl()
    MyBase.OnCreateControl()
    Me.FlatAppearance.MouseOverBackColor = Me.BackColor
    Me.FlatAppearance.MouseDownBackColor = Me.BackColor
    Me.FlatAppearance.BorderSize = 0
End Sub

Protected Overrides Sub OnMouseEnter(ByVal e As System.EventArgs)
    MyBase.OnMouseEnter(e)
    Me.FlatAppearance.BorderSize = 1
End Sub

Protected Overrides Sub OnMouseLeave(ByVal e As System.EventArgs)
    MyBase.OnMouseLeave(e)
    Me.FlatAppearance.BorderSize = 0
End Sub

Protected Overrides Sub OnPaint(ByVal pevent As System.Windows.Forms.PaintEventArgs)
    MyBase.OnPaint(pevent)
    Using P As New Pen(Me.BackColor)
        pevent.Graphics.DrawRectangle(P, 1, 1, Me.Width - 3, Me.Height - 3)
    End Using
End Sub

End Class

примечание: я не уверен на 100%, что "OnCreateControl" было лучшим событием для использования, но оно работало в моем тестировании.

0 голосов
/ 24 февраля 2014

Извлечение из кнопки и установка стиля элемента управления, чтобы элемент управления не мог быть выбран:

Imports System.Windows.Forms
Imports System.Drawing

Public Class MyButton
    Inherits Button

    Public Sub New()
        InitializeComponent()

        Me.BackColor = Color.LightGray
        Me.FlatStyle = Windows.Forms.FlatStyle.Flat
        Me.FlatAppearance.BorderColor = SystemColors.ControlDarkDark
        Me.FlatAppearance.MouseDownBackColor = Color.Cyan
        Me.FlatAppearance.MouseOverBackColor = SystemColors.ControlDark

        Me.TabStop = False
        Me.SetStyle(ControlStyles.Selectable, False)
    End Sub
End Class
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...