Ошибка в функции FontSize в Visual Basic при разработке офисного пакета - PullRequest
1 голос
/ 10 ноября 2019

После нескольких часов работы с функцией FontSize я застрял на куске кода. Список шрифтов, всякий раз, когда я хочу определить, что каждый шрифт имеет одинаковый размер, он автоматически масштабируется до 72.

Я просмотрел Интернет, чтобы узнать, как получить список шрифтов, который работал, ноКогда я добавил fontSize в выпадающий список sizecombo, он пришел в бешенство.

Imports System.Drawing.Text

Public Class wordking
    Dim fontSize As Integer = 8
    Private Sub wordking_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim myFont As New InstalledFontCollection

        For Each FontName As FontFamily In myFont.Families
            fontcombo.Items.Add(FontName.Name)
        Next
        For fontSize = 8 To 72 Step 2
            sizecombo.Items.Add(fontSize)
        Next
    End Sub
    Private Sub fontcombo_SelectedIndexChanged(sender As Object, e As EventArgs) Handles fontcombo.SelectedIndexChanged
        wordbox.SelectionFont = New Font(fontcombo.Text, fontSize, FontStyle.Regular)
    End Sub

    Private Sub sizecombo_SelectedIndexChanged(sender As Object, e As EventArgs) Handles sizecombo.SelectedIndexChanged
        Dim currentfontSize As Single = Convert.ToSingle(sizecombo.Text)
        wordbox.SelectionFont = New Font(wordbox.SelectionFont.FontFamily, currentfontSize)
    End Sub

    Private Sub ExitToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles ExitToolStripMenuItem.Click
        mainmenu.Show()
        Me.Close()
    End Sub
End Class

Я ожидал, что функция покажет список шрифтов, что и сделал, но также изменил размер шрифта до моего максимального значения 72. Эта ошибка убивает меня с ног.

1 Ответ

1 голос
/ 10 ноября 2019

Вот несколько моментов, которые могут помочь:

  • Чтобы заполнить поля со списком:
cmbFont.DataSource = New InstalledFontCollection().Families
cmbFont.DisplayMember = "Name"

For i As Integer = 8 To 72 Step 2
    cmbFontSize.Items.Add(i)
Next

'Assuming the target control is a TextBox:
cmbFont.SelectedIndex = cmbFont.Items.IndexOf(TextBox1.Font.FontFamily)
cmbFontSize.Text = TextBox1.Font.Size.ToString

  • Создайте подпрограмму, чтобы изменить шрифт, который будетВызывается из вызванных событий полей со списком:
Private Sub SetFont()
    If cmbFont.SelectedItem Is Nothing OrElse String.IsNullOrEmpty(cmbFontSize.Text) Then
        Return
    End If

    Dim fnt As FontFamily = DirectCast(cmbFont.SelectedItem, FontFamily)
    Dim fntSize As Single = Convert.ToSingle(cmbFontSize.Text)
    Dim fntStyle As FontStyle

    For Each fs As FontStyle In [Enum].GetValues(GetType(FontStyle))
        If fnt.IsStyleAvailable(fs) Then
            fntStyle = fs
            Exit For
        End If
    Next

    TextBox1.Font = New Font(fnt, fntSize, fntStyle)
End Sub

Обратите внимание, что вам также необходимо проверить FontStyle вновь выбранного шрифта, является ли обычный стиль (я вижу в вашем коде, что вы предпочитаетеобычный стиль) доступен. Если нет, будет выбран первый доступный стиль.

  • Обработка события SelectedIndexChanged шрифтов:
Private Sub cmbFont_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cmbFont.SelectedIndexChanged
    SetFont()
End Sub
  • Я думаю, что лучше обрабатывать событие TextChangedполя со списком размеров, чтобы пользователь мог ввести не перечисленное значение, например 11, 13 .. и т. д .:
Private Sub cmbFontSize_TextChanged(sender As Object, e As EventArgs) Handles cmbFontSize.TextChanged
    SetFont()
End Sub

Если вам также необходимо связать поля со списком с помощью текстового редактора для отображенияшрифт выделения всякий раз, когда выбор изменяется, тогда вы можете сделать:

  • Добавить переменную класса и назвать ее, скажем;
Private IsSelectionChanged As Boolean = False

Это будет использоваться дляизбегайте избыточностей.

  • Добавьте подпрограмму, чтобы получить шрифт из выделения:
Private Sub GetFont()
    IsSelectionChanged = True

    Dim fnt As Font = If(txtEditor.SelectionFont, txtEditor.Font)

    cmbFont.SelectedIndex = cmbFont.Items.IndexOf(fnt.FontFamily)
    cmbFontSize.Text = fnt.Size.ToString

    IsSelectionChanged = False
End Sub
  • Измените первую строку в подпрограмме SetFont следующим образом:
Private Sub SetFont()
    If IsSelectionChanged OrElse cmbFont.SelectedItem Is Nothing OrElse String.IsNullOrEmpty(cmbFontSize.Text) Then
        Return
    End If
'
'
'The rest as the above mentioned...
End Sub
  • В выделенном вами измененном событии редактор:
Private Sub txtEditor_SelectionChanged(sender As Object, e As EventArgs) Handles txtEditor.SelectionChanged
    GetFont()
End Sub

Вот и все. Просто настройте его в соответствии с вашими требованиями.

Вот короткая демонстрация:

enter image description here

Удачи.

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