インストールされているフォント名を列挙する方法は以前やりました。
使用できるフォントをコンボボックスのなかに表示させる
選択文字列が変更するたびにフォント名を調べてコンボボックスに表示させるのも難しくありません。
ではコンボボックス内の項目を選択して選択文字列に反映するためにはどうすればいいのでしょうか?
ToolStripのうえに表示させられるコントロールにはコンボボックスがありますが、これが普通のコンボボックスではありません。ではToolStripのうえには好きなコントロールを乗せることはできないのでしょうか? そんなことはありません。
ToolStrip(ツールバー、メニュー、ステータスバー)に任意のコントロールを配置する – .NET Tips (VB.NET,C#…
このサイトの説明によると「ToolStripControlHostクラスを使えば、任意のコントロールをToolStripにのせることができます」とあります。
「ToolStripControlHostの派生クラスを作成して、専用のクラスを作成する」という項目があります。これなら簡単にToolStripに追加できるようになります。
1 2 3 4 5 6 |
public class ToolStripNumericUpDown : ToolStripControlHost { public ToolStripNumericUpDown() : base(new NumericUpDown()) { } } |
これならNumericUpDownをToolStripに乗せることができるようになります。ただこれだけでは使いにくいので
ホストしているNumericUpDownコントロールをプロパティで公開する
よく使うメソッドやプロパティもToolStripNumericUpDownクラスで公開する
という方法を紹介しています。
ではいまやりたいことはComboBoxをToolStripに乗せることです。あえて作らなくてもToolStripComboBoxがあるのですが、ちょっと使いにくいです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public class ToolStripComboBox : ToolStripControlHost { public ToolStripComboBox() : base(new ComboBox()) { } public ComboBox ComboBox { get { return (ComboBox)Control; } } } |
こんなクラスをつくればOKです。
コンボボックスが閉じられる場合、項目が選択されたため閉じられる場合と、選択されずに閉じられる場合があります。後者の場合はなにもしなくてよいと思われます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public partial class Form1 : Form { public Form1() { // これより上は省略 List<string> fonts = GetFonts(); foreach (string s in fonts) toolStripComboBoxFontName.ComboBox.Items.Add(s); toolStripComboBoxFontName.ComboBox.SelectionChangeCommitted += ComboBox_SelectionChangeCommitted; int[] sizes = { 8, 9, 10, 11, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50 }; foreach(int size in sizes) toolStripComboBoxFontSize.ComboBox.Items.Add(size); toolStripComboBoxFontSize.ComboBox.SelectionChangeCommitted += ComboBox_SelectionChangeCommitted1; } } |
SelectionChangeCommittedイベントは、コンボボックスリストの選択項目への変更が確定されたときに発生します。単にコンボボックスが閉じられただけでは発生しません。
SelectionChangeCommittedイベントが発生したら
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public partial class Form1 : Form { private void ComboBox_SelectionChangeCommitted(object sender, EventArgs e) { syncRichTextBoxEx1.SelectionFontName = toolStripComboBoxFontName.ComboBox.SelectedItem.ToString(); } private void ComboBox_SelectionChangeCommitted1(object sender, EventArgs e) { string str = toolStripComboBoxFontSize.ComboBox.SelectedItem.ToString(); syncRichTextBoxEx1..SelectionFontSize = float.Parse(str); } } |
これでコンボボックスの内容をRichTextBoxに反映させることができます。
ところでコンボボックスの項目を選択するときにフォーカスがRichTextBoxから外れてしまうので、
1 2 3 4 5 |
SyncRichTextBox rich = null; if (syncRichTextBoxEx2.Focused) rich = syncRichTextBoxEx2; else rich = syncRichTextBoxEx1; |
こんなことをしても下側のRichTextBoxに設定を反映させることはできません。