現在、フォームの拡大Verを作っており、拡大設定にすると、すべてのコントロールのサイズ、フォントを大きくし、小設定にすると通常サイズに戻す部分を作っています。
で、フォントを元に戻すという部分ですが、MSDNのコントロールのリファレンス見てると面白そうなメソッドがありました。
Control.ResetFont()というメソッドです。
Controlを継承しているTextBoxやLabelとかでももちろん使えます。
が、なぜか下記のSSのようにインテリセンスに出てきません。
MSDNでTextBox.ResetFont()のリファレンスをみると、Control.RestFont()に飛ぶのですが、「このクラスでは、このメソッドは使用されません。 」と表示されてしまいます。
このResetFont()は「Font プロパティを既定値にリセット」するものだそうです。
じゃあ、規定値ってどの値やねん!と思って試してみると、どうやら下記の値みたいです。
[Font: Name=MS UI Gothic, Size=9, Units=3, GdiCharSet=128, GdiVerticalFont=False]
GroupBoxにフォントを設定すると、そのGroupBox上の他のコントロール(規定値にしていると)のフォントも自動的に引き継がれると思います。
ということで、試してみました。
まずデザイナで下記のように設定します。
GroupBox1のフォントはすべて規定値。
GroupBox2 , Label4 , TextBox4 のフォントを変更してます。
まず下記のようなソースだとします。
Public Class Form1Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'GroupBxoとその中にある、フォントデフォルトの子コントロールのフォントも自動的に変更される。
Me.GroupBox1.Font = New System.Drawing.Font("MS ゴシック", 15.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(128, Byte))
Me.GroupBox2.Font = Me.GroupBox1.Font
'子コントロールを個別に設定している場合は、GroupBoxのフォントに依存しないため、個別に設定しないといけない
Me.TextBox4.Font = Me.GroupBox1.Font
Me.Label4.Font = Me.TextBox4.Font
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
'GroupBoxとその中になる、フォントがデフォルトの子コントロールのフォントをリセット(MS UI Gothic, 9pt)にする
Me.GroupBox1.ResetFont()
Me.GroupBox2.ResetFont()
'↓これをするとMS UI Gothic, 9ptになってしまう。
Me.TextBox4.ResetFont()
Me.Label4.ResetFont()
End Sub
End Class
Label4 , TextBox4 はデザイナの段階で意図的にフォントを設定しているため、GroupBoxのフォントの設定が反映されません。それで、個別に設定する必要があります。
この状態で大ボタンを押すと下記のようにGroupBoxに設定したフォントになります。
小ボタンを押すと、すべてMS UI ゴシックの9ptになります。
で、Label4 , TextBox4 を元(デザイナで設定した値)に戻すには下記のソースのように一旦退避して戻すという手順になります。
Public Class Form1Private m_bkFont As New List(Of Font)
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'GroupBxoとその中にある、フォントデフォルトの子コントロールのフォントも自動的に変更される。
Me.GroupBox1.Font = New System.Drawing.Font("MS ゴシック", 15.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(128, Byte))
Me.GroupBox2.Font = Me.GroupBox1.Font
'子コントロールを個別に設定している場合は、GroupBoxのフォントに依存しないため、個別に設定しないといけない
Me.TextBox4.Font = Me.GroupBox1.Font
Me.Label4.Font = Me.TextBox4.Font
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
'GroupBoxとその中になる、フォントがデフォルトの子コントロールのフォントをリセット(MS UI Gothic, 9pt)にする
Me.GroupBox1.ResetFont()
Me.GroupBox2.ResetFont()
'↓これをするとMS UI Gothic, 9ptになってしまう。
'Me.TextBox4.ResetFont()
'Me.Label4.ResetFont()
''そのため、退避しておいたフォントの設定を元に戻す
Me.TextBox4.Font = m_bkFont(0)
Me.Label4.Font = m_bkFont(1)
End Sub
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
'一旦、今のフォントをメンバ変数に退避しておき、新フォントを割りあてる
Me.m_bkFont.Add(Me.TextBox4.Font)
Me.m_bkFont.Add(Me.Label4.Font)
End Sub
End Class
このソースで小ボタンをおすとこうなります。
ちなみに、フォーム上のコントロール数が多い場合、この設定したフォントをメンバ変数に退避しておく方法だと、反映に非常に時間がかかるっぽいです。
RestFont()は非常に速いんですがね。。。
また、フォーム自体のフォントを変更するとフォームサイズも変わってしまいます。
要注意ですね。
まあ、MS UI ゴシック 9ptに戻す時に RestFont() は使えるっぽいですね。