RichTextBox は使ったことありませんが、意外と簡単にそれっぽいものができちゃうんで
オドロキでございました。
実装している中には、TextBoxBase のものも含まれてますけども、
使う場面が多いかしら...とおもったものを入れてみました。
いや、RichTextBox 自体、これからもあまり使わないか...。
■参考文献
RichTextBox クラス
RichTextBox コントロール (Windows フォーム)
■実行画像
ごはんを強調してみました。
Public Class RichTextBoxTest
Private Const ZOOM_NUMERIC_UPDOWN As String = "zoomNumericUpDown"
Private Const LOAD_FILE_TYPES_COMBO As String = "loadFileTypesComboBox"
Private Const SAVE_FILE_TYPES_COMBO As String = "saveFileTypesComboBox"
Private m_richTextBox As RichTextBox
Private Sub RichTextBoxTest_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim context As ContextMenuStrip = New ContextMenuStrip()
Me.m_richTextBox = New RichTextBox()
Me.Controls.Add(Me.m_richTextBox)
With Me.m_richTextBox
.ContextMenuStrip = context
.Dock = DockStyle.Fill
' True → タブ文字を入力できる
' False → フォーカス移動(既定値)
.AcceptsTab = True
' True → テキストの一部を選択すると、その単語全体が選択される(既定値)
.AutoWordSelection = True
' 行頭文字の後にインデント幅として挿入するピクセル数(既定値:0)
.BulletIndent = 4
' URL が入力されたら書式を自動的に変換するか(既定値)
.DetectUrls = True
' (既定値:AutoFontSizeAdjust)
.LanguageOption = RichTextBoxLanguageOptions.DualFont
' 最大文字数(既定値:Integer.MaxValue)
.MaxLength = Integer.MaxValue
' 複数行か否か(既定値:True)
.Multiline = True
' コントロールの左端から指定したピクセル数までの部分が、目に見えない余白として設定されます。
' この余白を超えて入力されたテキストは、コントロール内のテキストの次の行に表示されます
.RightMargin = 0
' スクロールバー(既定値:RichTextBoxScrollBars.Both)
.ScrollBars = RichTextBoxScrollBars.ForcedBoth
' Ctrl + Z(Undo) や Ctrl + Y(Redo) を有効にする(既定値:True)
.ShortcutsEnabled = True
' 選択余白を表示するか否か(既定値:False)
.ShowSelectionMargin = True
' ワードラップするか否か
.WordWrap = True
' コントロールの内容をズームする倍率
' 1/64 から 64.0。1.0 はズームしないことを意味する。
.ZoomFactor = 1.0F
AddHandler .LinkClicked, AddressOf LinkClicked
AddHandler .SelectionChanged, AddressOf SelectionChanged
End With
'' ContextMeunStrip の設定
'' 出力
Dim immediateMenuItem As ToolStripMenuItem = New ToolStripMenuItem("出力")
context.Items.Add(immediateMenuItem)
AddHandler immediateMenuItem.Click, AddressOf OutputToImmediateWindow
'' 倍率変更
Dim zoomMenuItem As ToolStripMenuItem = New ToolStripMenuItem("倍率変更")
context.Items.Add(zoomMenuItem)
' MenuStrip の時に作ったもの
Dim numericItem As NumericUpDownItem = New NumericUpDownItem()
numericItem.Name = ZOOM_NUMERIC_UPDOWN
With numericItem.NumericUpDown
.Value = CDec(Me.m_richTextBox.ZoomFactor)
.Minimum = CDec(1 / 64)
.Maximum = 64D
End With
zoomMenuItem.DropDownItems.Add(numericItem)
Dim zoomChange As ToolStripButton = New ToolStripButton("変更")
zoomMenuItem.DropDownItems.Add(zoomChange)
AddHandler zoomChange.Click, AddressOf ZoomFactorChange
'' 背景色
Dim backColorMenuItem As ToolStripMenuItem = New ToolStripMenuItem("背景色")
context.Items.Add(backColorMenuItem)
AddHandler backColorMenuItem.Click, AddressOf BackColorChange
'' 前景色
Dim colorMenuItem As ToolStripMenuItem = New ToolStripMenuItem("前景色")
context.Items.Add(colorMenuItem)
AddHandler colorMenuItem.Click, AddressOf ColorChange
'' フォント
Dim fontMenuItem As ToolStripMenuItem = New ToolStripMenuItem("フォント")
context.Items.Add(fontMenuItem)
AddHandler fontMenuItem.Click, AddressOf FontChange
'' 保護
Dim protectedMenuItem As ToolStripMenuItem = New ToolStripMenuItem("保護")
context.Items.Add(protectedMenuItem)
AddHandler protectedMenuItem.DropDownOpening, AddressOf ProtectedOpening
AddHandler protectedMenuItem.Click, AddressOf ProtectedChange
'' 箇条書きスタイルを適用
Dim bulletMenuItem As ToolStripMenuItem = New ToolStripMenuItem("箇条書きスタイル")
context.Items.Add(bulletMenuItem)
AddHandler bulletMenuItem.DropDownOpening, AddressOf BulletOpening
AddHandler bulletMenuItem.Click, AddressOf BulletChange
'' LoadFile
Dim loadMenuItem As ToolStripMenuItem = New ToolStripMenuItem("LoadFile")
context.Items.Add(loadMenuItem)
Dim loadFileTypes As ToolStripComboBox = New ToolStripComboBox()
loadMenuItem.DropDownItems.Add(loadFileTypes)
With loadFileTypes
.Name = LOAD_FILE_TYPES_COMBO
.DropDownStyle = ComboBoxStyle.DropDownList
.Items.Add(RichTextBoxStreamType.PlainText)
.Items.Add(RichTextBoxStreamType.RichNoOleObjs)
.Items.Add(RichTextBoxStreamType.RichText)
.Items.Add(RichTextBoxStreamType.TextTextOleObjs)
.Items.Add(RichTextBoxStreamType.UnicodePlainText)
.SelectedIndex = 0
End With
Dim loadFileButton As ToolStripButton = New ToolStripButton("読込")
loadMenuItem.DropDownItems.Add(loadFileButton)
AddHandler loadFileButton.Click, AddressOf RichTextBox_LoadFile
'' SaveFile
Dim saveMenuItem As ToolStripMenuItem = New ToolStripMenuItem("SaveFile")
context.Items.Add(saveMenuItem)
Dim saveFileTypes As ToolStripComboBox = New ToolStripComboBox()
saveMenuItem.DropDownItems.Add(saveFileTypes)
With saveFileTypes
.Name = SAVE_FILE_TYPES_COMBO
.DropDownStyle = ComboBoxStyle.DropDownList
.Items.Add(RichTextBoxStreamType.PlainText)
.Items.Add(RichTextBoxStreamType.RichNoOleObjs)
.Items.Add(RichTextBoxStreamType.RichText)
.Items.Add(RichTextBoxStreamType.TextTextOleObjs)
.Items.Add(RichTextBoxStreamType.UnicodePlainText)
.SelectedIndex = 0
End With
Dim saveFileButton As ToolStripButton = New ToolStripButton("保存")
saveMenuItem.DropDownItems.Add(saveFileButton)
AddHandler saveFileButton.Click, AddressOf RichTextBox_SaveFile
End Sub
' RichTextBox 内の Link がクリックされた時のイベント
Private Sub LinkClicked(ByVal sender As Object, ByVal e As LinkClickedEventArgs)
Process.Start(e.LinkText)
End Sub
Private Sub SelectionChanged(ByVal sender As Object, ByVal e As EventArgs)
With Me.m_richTextBox
' 現在選択されている内容またはカーソル位置に適用される配置
System.Diagnostics.Debug.WriteLine("SelectionAlignment:" & .SelectionAlignment.ToString())
' 選択されているテキストの背景色
System.Diagnostics.Debug.WriteLine("SelectionBackColor:" & .SelectionBackColor.ToString())
' 現在選択されている内容またはカーソル位置に箇条書きスタイルを適用するかどうか
System.Diagnostics.Debug.WriteLine("SelectionBullet:" & .SelectionBullet.ToString())
' テキストが、ベースラインより上に上付き文字として表示されるのか、ベースラインより下に下付き文字として表示されるのか
System.Diagnostics.Debug.WriteLine("SelectionCharOffset:" & .SelectionCharOffset.ToString())
' 選択されているテキストの色
System.Diagnostics.Debug.WriteLine("SelectionColor:" & .SelectionColor.ToString())
' 選択されているテキストのフォント
System.Diagnostics.Debug.WriteLine("SelectionFont:" & .SelectionFont.ToString())
' 選択されている段落の最初のテキスト行の左端から、同じ段落の後続行の左端までの距離
System.Diagnostics.Debug.WriteLine("SelectionHangingIndent:" & .SelectionHangingIndent.ToString())
' 選択が開始される行のインデントの長さ (ピクセル単位)
System.Diagnostics.Debug.WriteLine("SelectionIndent:" & .SelectionIndent.ToString())
' 選択されている文字数
System.Diagnostics.Debug.WriteLine("SelectionLength:" & .SelectionLength.ToString())
' 選択されている文字が保護されているか
System.Diagnostics.Debug.WriteLine("SelectionProtected:" & .SelectionProtected.ToString())
' コントロールの右端から、選択されているテキストの右端または現在のカーソル位置に追加されたテキストの右端までの距離 (ピクセル単位)
System.Diagnostics.Debug.WriteLine("SelectionRightIndent:" & .SelectionRightIndent.ToString())
' 選択されているテキストの開始点
System.Diagnostics.Debug.WriteLine("SelectionStart:" & .SelectionStart.ToString())
' コントロール内のタブ ストップの絶対位置
System.Diagnostics.Debug.WriteLine("SelectionTabs:" & .SelectionTabs.ToString())
' 選択されているデータの型
System.Diagnostics.Debug.WriteLine("SelectionType:" & .SelectionType.ToString())
End With
End Sub
' イミディエイトウィンドウに出力する
Private Sub OutputToImmediateWindow(ByVal sender As Object, ByVal e As EventArgs)
With Me.m_richTextBox
' Redo できるか
System.Diagnostics.Debug.WriteLine("CanRedo:" & .CanRedo)
' Redo Action 名
System.Diagnostics.Debug.WriteLine("RedoActionName:" & .RedoActionName)
' Undo できるか
System.Diagnostics.Debug.WriteLine("CanUndo:" & .CanUndo)
' Undo Action 名
System.Diagnostics.Debug.WriteLine("UndoActionName:" & .UndoActionName)
' 全てのテキスト
For Each stLine As String In .Lines
System.Diagnostics.Debug.WriteLine(stLine)
Next
' テキストの長さ
System.Diagnostics.Debug.WriteLine("TextLength:" & .TextLength)
' 選択されているテキスト
System.Diagnostics.Debug.WriteLine("SelectedText:" & .SelectedText)
' 全ての RTF 形式テキスト
System.Diagnostics.Debug.WriteLine("Rtf:" & .Rtf)
' 選択されている RTF 形式テキスト
System.Diagnostics.Debug.WriteLine("SelectedRtf:" & .SelectedRtf)
End With
End Sub
' 表示倍率の変更
Private Sub ZoomFactorChange(ByVal sender As Object, ByVal e As EventArgs)
Dim dropdown As ToolStripDropDownMenu = DirectCast(DirectCast(sender, ToolStripButton).Owner, ToolStripDropDownMenu)
Dim numericItem As NumericUpDownItem = DirectCast(dropdown.Items(ZOOM_NUMERIC_UPDOWN), NumericUpDownItem)
Me.m_richTextBox.ZoomFactor = CSng(numericItem.NumericUpDown.Value)
End Sub
' 背景色の変更
Private Sub BackColorChange(ByVal sender As Object, ByVal e As EventArgs)
Using colorDlg As ColorDialog = New ColorDialog()
colorDlg.Color = Me.m_richTextBox.SelectionBackColor
If colorDlg.ShowDialog(Me) = Windows.Forms.DialogResult.OK Then
Me.m_richTextBox.SelectionBackColor = colorDlg.Color
End If
End Using
End Sub
' 前景色の変更
Private Sub ColorChange(ByVal sender As Object, ByVal e As EventArgs)
Using colorDlg As ColorDialog = New ColorDialog()
colorDlg.Color = Me.m_richTextBox.SelectionColor
If colorDlg.ShowDialog(Me) = Windows.Forms.DialogResult.OK Then
Me.m_richTextBox.SelectionColor = colorDlg.Color
End If
End Using
End Sub
' フォントの変更
Private Sub FontChange(ByVal sender As Object, ByVal e As EventArgs)
Using fontDlg As FontDialog = New FontDialog()
fontDlg.Font = Me.m_richTextBox.SelectionFont
If fontDlg.ShowDialog(Me) = Windows.Forms.DialogResult.OK Then
Me.m_richTextBox.SelectionFont = fontDlg.Font
End If
End Using
End Sub
' 箇条書きスタイルメニュー Opening イベント
Private Sub BulletOpening(ByVal sender As Object, ByVal e As EventArgs)
Dim menu As ToolStripMenuItem = DirectCast(sender, ToolStripMenuItem)
menu.Checked = Me.m_richTextBox.SelectionBullet
End Sub
' 箇条書きスタイルメニュー
Private Sub BulletChange(ByVal sender As Object, ByVal e As EventArgs)
Dim menu As ToolStripMenuItem = DirectCast(sender, ToolStripMenuItem)
menu.Checked = Not menu.Checked
Me.m_richTextBox.SelectionBullet = menu.Checked
End Sub
' 保護メニュー Opening イベント
Private Sub ProtectedOpening(ByVal sender As Object, ByVal e As EventArgs)
Dim menu As ToolStripMenuItem = DirectCast(sender, ToolStripMenuItem)
menu.Checked = Me.m_richTextBox.SelectionProtected
End Sub
' 保護
Private Sub ProtectedChange(ByVal sender As Object, ByVal e As EventArgs)
Dim menu As ToolStripMenuItem = DirectCast(sender, ToolStripMenuItem)
menu.Checked = Not menu.Checked
Me.m_richTextBox.SelectionProtected = menu.Checked
End Sub
' ファイルの読み込み
Private Sub RichTextBox_LoadFile(ByVal sender As Object, ByVal e As EventArgs)
Dim dropdown As ToolStripDropDownMenu = DirectCast(DirectCast(sender, ToolStripButton).Owner, ToolStripDropDownMenu)
Dim comboItem As ToolStripComboBox = DirectCast(dropdown.Items(LOAD_FILE_TYPES_COMBO), ToolStripComboBox)
Dim fileType As RichTextBoxStreamType = DirectCast(comboItem.SelectedItem, RichTextBoxStreamType)
Dim ext As String = CStr(IIf(fileType.ToString().Contains("Rich"), "rtf", "txt"))
Using openfileDlg As OpenFileDialog = New OpenFileDialog()
openfileDlg.Filter = ext & "|*." & ext
If openfileDlg.ShowDialog(Me) = Windows.Forms.DialogResult.OK Then
Me.m_richTextBox.LoadFile(openfileDlg.FileName, fileType)
End If
End Using
End Sub
' ファイルの書き出し
Private Sub RichTextBox_SaveFile(ByVal sender As Object, ByVal e As EventArgs)
Dim dropdown As ToolStripDropDownMenu = DirectCast(DirectCast(sender, ToolStripButton).Owner, ToolStripDropDownMenu)
Dim comboItem As ToolStripComboBox = DirectCast(dropdown.Items(SAVE_FILE_TYPES_COMBO), ToolStripComboBox)
Dim fileType As RichTextBoxStreamType = DirectCast(comboItem.SelectedItem, RichTextBoxStreamType)
Dim ext As String = CStr(IIf(fileType.ToString().Contains("Rich"), "rtf", "txt"))
Dim fileName As String = System.IO.Path.ChangeExtension(DateTime.Now.ToString("yyyyMMddHHmmss"), ext)
Using savefileDlg As SaveFileDialog = New SaveFileDialog()
savefileDlg.FileName = fileName
savefileDlg.Filter = ext & "|*." & ext
If savefileDlg.ShowDialog(Me) = Windows.Forms.DialogResult.OK Then
Me.m_richTextBox.SaveFile(savefileDlg.FileName, fileType)
End If
End Using
End Sub
End Class