RichTextBox.SelectionCharOffsetプロパティを設定することでベースラインを変更することができます。
1 |
SelectionCharOffset = newOffset; |
この同期されたRichTextBoxでも同じようにやってみましょう。こんなこともできてしまいます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
public partial class SyncRichTextBox : UserControl { public int SelectionOffset { get { return richTextBoxEx1.SelectionCharOffset; } set { SetOffset(value, false); } } public int SelectionOffsetPlus { set { SetOffset(value, true); } } void SetOffset(int offset, bool IsGrow) { int start = SelectionStart; int len = SelectionLength; RichTextBox r = new RichTextBox(); r.SelectedRtf = SelectedRtf; for (int i = 0; i < len; i++) { r.Select(i, 1); int oldOffset = r.SelectionCharOffset; int newOffset = offset; if (IsGrow) newOffset = oldOffset + offset; r.SelectionCharOffset = newOffset; } r.SelectAll(); string rtf = r.SelectedRtf; r.Dispose(); if (SelectedRtf == rtf) return; string action = ""; if (IsGrow) action = "PlusSelectionOffset"; else action = "SetSelectionOffset"; if (SetSelectedRtf(rtf, action)) { Undobuf buf = Data.GetUndobuf(); buf.newSelectionStart = start; buf.newSelectionLength = len; SelectionStart = start; SelectionLength = len; } } } |
まずRichTextBox.SelectionCharOffsetプロパティを取得するためにカーソルが移動するため、ちょっとうっとうしく感じるかもしれません。そのため対象範囲をまるごと別のRichTextBoxにコピーして処理をしています。そして変更前のSelectionRtfと変更後のSelectionRtfを取得してSetSelectedRtfメソッドを呼んでいます。
以下はSelectionCharOffsetプロパティを設定するために作成されたプロパティです。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public partial class SyncRichTextBox : UserControl { public int SelectionOffset { get { return richTextBoxEx1.SelectionCharOffset; } set { SetOffset(value, false); } } public int SelectionOffsetPlus { set { SetOffset(value, true); } } } |
Ctrl+UP、Ctrl+DOWNキーで上記のプロパティが設定されるようになっています。Ctrl+UPでベースラインが上に20ピクセル、Ctrl+DOWNで下に20ピクセル移動します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public partial class SyncRichTextBox : UserControl { protected override void OnKeyDown(KeyEventArgs e) { if (e.KeyCode == Keys.Up && e.Control) { e.Handled = true; SelectionOffsetPlus = 20; return; } if (e.KeyCode == Keys.Down && e.Control) { e.Handled = true; SelectionOffsetPlus = -20; return; } base.OnKeyDown(e); } } |