如何在Visual Basic中同时运行两个复选框事件



我正试图在Visual Basic中创建一个表单,允许人们在复古记录上写评论。当它显示最终结果时,我必须能够让用户使文本变得更粗体、斜体、下划线等。我希望通过使用复选框来实现这一点,但如果同时运行两个复选框事件,我不确定该写什么代码。

非常感谢您的帮助。

不会有"两个复选框事件同时运行">。您的实际意思是同时检查两个CheckBoxes。这相当简单,因为应用于TextBoxFontStyle属性是类型FontStyle,它支持复合值。在Bold的CheckBoxCheckedChanged事件中,您将执行以下操作:

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。当您使用二进制表示时,很容易看到发生了什么。

类似于FontStyleEnums是数字的友好表示。BoldItalicUnderline字段的值分别为1、2和4,它们是二进制的001、010和100。正如您所看到的,每个字段在其二进制表示中都有一个且只有一个位集。逐位操作非常有用,因为它们可以设置或重置组合值中的单个位。例如,如果您没有设置样式,并且希望应用Bold样式,则会得到以下内容:

000001---或001

如果在第一个操作数或第二个操作数中设置了特定的位,则结果将具有特定的位集,因此为逐位Or运算符。如果您还想设置Underline样式:

001100---或101

所以BoldUnderline的组合是二进制的101,十进制为5。如果你想删除Bold样式,你应该首先删除NotBold样式,这意味着切换每一位:

001---不是110

,然后您将使用现有的组合样式And

101110---以及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

正如您所看到的,将扩展作为实例方法调用比每次编写完整的逐位表达式更简单。

最新更新