Не будет "два события флажка, запущенных одновременно" . На самом деле вы имеете в виду два CheckBoxes
, проверенных одновременно. Это довольно просто, потому что свойство Style
Font
, примененное к вашему TextBox
, имеет тип FontStyle
, который поддерживает составные значения. В CheckedChanged
событии CheckBox
для Bold вы должны сделать следующее:
If CheckBox1.Checked Then
'Apply the Bold style.
TextBox1.Font = New Font(TextBox1.Font, TextBox1.Font.Style Or FontStyle.Bold)
Else
'Remove the Bold style.
TextBox1.Font = New Font(TextBox1.Font, TextBox1.Font.Style And Not FontStyle.Bold)
End If
Вы просто замените Bold
на соответствующее поле в других обработчиках событий.
Может показаться немного нелогичным использование Or
в этой ситуации, но важно понимать, что это побитовая операция. Побитовые операции - это, по сути, логические операции с каждой парой битов в операндах, где 1 представляет True
, а 0 представляет False
. Легко увидеть, что происходит, когда вы используете двоичные представления.
Enums
, как FontStyle
, являются дружественными представлениями чисел. Поля Bold
, Italic
и Underline
имеют значения 1, 2 и 4 соответственно, которые являются 001, 010 и 100 в двоичном виде. Как видите, каждое поле имеет один и только один бит, установленный в его двоичном представлении. Побитовые операции полезны, потому что они могут устанавливать или сбрасывать один бит в комбинированном значении. Например, если у вас нет установленных стилей и вы хотите применить стиль Bold
, вы получите следующее:
000
001
---OR
001
В результате будет установлен конкретный бит, если этот бит установлен в первом операнде ИЛИвторой, следовательно, побитовый оператор Or
. Если вы затем хотите установить стиль Underline
тоже:
001
100
---OR
101
Таким образом, комбинация Bold
и Underline
равна 101 в двоичном формате, что составляет 5 в десятичном виде. Если вы затем хотите удалить стиль Bold
, вы сначала должны Not
стиль Bold
, что означает переключение каждого бита:
001
---NOT
110
, и тогда вы бы And
получили результатсуществующий комбинированный стиль:
101
110
---AND
100
Побитовый оператор And
устанавливает бит в результат, если он не установлен в первом операнде И втором операнде. В этом случае единственный бит, который устанавливается в обоих операндах, является первым, поэтому он является единственным битом, установленным в результате. Это означает, что результат равен 100 в двоичном, что равно 4 в десятичном виде и соответствует стилю Underline
, что является именно тем, что мы ожидаем.
РЕДАКТИРОВАТЬ:
Вот наборметодов расширения, упрощающих работу с элементами управления и стилями шрифтов:
Imports System.Runtime.CompilerServices
Public Module ControlExtensions
<Extension>
Public Sub AddFontStyle(source As Control, style As FontStyle)
source.Font = New Font(source.Font, source.Font.Style Or style)
End Sub
<Extension>
Public Sub RemoveFontStyle(source As Control, style As FontStyle)
source.Font = New Font(source.Font, source.Font.Style And Not style)
End Sub
<Extension>
Public Sub ToggleFontStyle(source As Control, style As FontStyle)
source.Font = New Font(source.Font, source.Font.Style Xor style)
End Sub
<Extension>
Public Function ContainsFontStyle(source As Control, style As FontStyle) As Boolean
Return (source.Font.Style And style) = style
End Function
End Module
Вот пример использования:
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
TextBox1.AddFontStyle(FontStyle.Bold)
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
TextBox1.RemoveFontStyle(FontStyle.Bold)
End Sub
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
TextBox1.ToggleFontStyle(FontStyle.Bold)
End Sub
Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
MessageBox.Show(TextBox1.ContainsFontStyle(FontStyle.Bold).ToString())
End Sub
Как видите, вызов расширений как методов экземпляра прощечем записывать полное побитовое выражение каждый раз.