Как иметь два события флажка, выполняющихся одновременно в Visual Basic? - PullRequest
0 голосов
/ 07 ноября 2019

Я пытаюсь создать форму в Visual Basic, которая позволяет людям писать рецензии на старинные записи. Поскольку он показывает конечный результат, я должен иметь возможность позволить пользователю сделать текст жирным, курсивом, подчеркнутым и т. Д. Я хочу сделать это с помощью флажков, но я не уверен, какой код писать, если ядолжны были иметь два события флажка, запущенных одновременно.

Любая помощь приветствуется, большое спасибо.

1 Ответ

3 голосов
/ 07 ноября 2019

Не будет "два события флажка, запущенных одновременно" . На самом деле вы имеете в виду два 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

Как видите, вызов расширений как методов экземпляра прощечем записывать полное побитовое выражение каждый раз.

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