2010-05-14 2 views
4

Я устанавливаю свойства управления Button Winforms, которые будут отображаться в виде гиперссылки на веб-странице. Я отформатировал все отлично, за исключением границы объекта 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 Button», поэтому добавьте границу границы вокруг кнопки.

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

+0

У меня нет ответа для вас, но есть причина, что вы пытаетесь взломать кнопку в делать то же самое, что и LinkLabel? –

ответ

4

Вы можете переопределить 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 
+0

Удивительный! Работает как шарм. – HardCode

2

Другой способ чтобы выполнить это, чтобы наследовать класс 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

Derving от кнопки и настройки стиля управления, так что управление не может быть выбрано:

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 
Смежные вопросы