3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援→開発戻り浦島太郎状態の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。

(.Net)Control.Reset()メソッドは使えるか?

現在、フォームの拡大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 Form1

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()

End Sub

End Class

Label4 , TextBox4 はデザイナの段階で意図的にフォントを設定しているため、GroupBoxのフォントの設定が反映されません。それで、個別に設定する必要があります。

この状態で大ボタンを押すと下記のようにGroupBoxに設定したフォントになります。

小ボタンを押すと、すべてMS UI ゴシックの9ptになります。

で、Label4 , TextBox4 を元(デザイナで設定した値)に戻すには下記のソースのように一旦退避して戻すという手順になります。

Public Class Form1

Private 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() は使えるっぽいですね。

参考:Control..::.ResetFont メソッド