フォーム上のボタン等のフォントを一括変更したい

タグの編集
投稿者 sakuto  (社会人) 投稿日時 2022/10/6 08:40:10
VB.NETのアプリケーションで、あるボタンを押したときにあるフォーム上の全てのコントロールのフォントを一括変更したいのですが、どのような方法がありますか?
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2022/10/6 10:56:08
Button の Font を未設定にしておいては如何でしょうか?
既にデザイン時に設定済みの場合は、プロパティの [Font] 欄を右クリックして[リセット]を選びます。
実行時にリセットするには、「Button1.ResetFont()」などと記述します。


Font プロパティが未設定の場合、その親コントロール(Form とか Panel とか)の Font 設定が
受け継がれる仕様です。
その場合、親コントロールの Font を変更するだけで、
その上にあるコントロールの Font も連鎖的に変更されます。

つまり、「Me.Font = 新しいフォント」と書くだけで、その配下にあるコントロールのうち、
Font が未設定のコントロールのフォントを一斉に変化させることができます。

このような動作のプロパティを、アンビエント(ambient)プロパティと言います。
http://rucio.cloudapp.net/ThreadDetail.aspx?ThreadId=30257

逆に、親コントロールの Font に連動して欲しくない時には、デザイン時などにて
連動させたくないコントロールの Font を明示的に指定しておけば OK です。


あるいはループ処理でボタンを列挙し、ひとつひとつ Font を書き換えていく手法もあります。
下記は、Panel1 の上にある Button 群の Font と、
Form1 直下にある Button 群の Font をそれぞれ設定する場合のコードです。


Dim fnt1 As Font = 新しいフォント
For Each btn In Me.Controls.OfType(Of Button)()
    btn.Font = fnt1
Next
Dim fnt2 As Font = 新しいフォント
For Each btn In Panel1.Controls.OfType(Of Button)()
    btn.Font = fnt2
Next



親コントロールが何であろうとも、フォーム上にあるすべての Button を対象にする場合は、
Controls を再帰的に列挙する方法が使えます。

Dim fnt As Font = 新しいフォント
For Each btn In GetDescendants().OfType(Of Button)()
    btn.Font = fnt
Next

上記の GetDescendants メソッドについては下記をご覧ください。
http://rucio.cloudapp.net/ThreadDetail.aspx?ThreadId=30737
投稿者 sakuto  (社会人) 投稿日時 2022/10/6 13:37:30
魔界の仮面弁士様

返答有難うございます。アンビエントプロパティは初めての知識でとてもタメになりました。

返答に返すようで申し訳ないですが、フォントプロパティのサイズのみを残しフォントだけ変更できる
ことは可能でしょうか?フォントを変更しその後サイズを指定するコードしか思いつかなかったので。。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2022/10/6 14:08:28
> フォントプロパティのサイズのみを残しフォントだけ変更できる

Font の Size、FontFamily、Name などは ReadOnly なので変更できません。
元のフォントをテンプレートとして、新しいフォントを作成することで代用しましょう。

Dim fnt1 As Font = Me.Font
Dim fnt2 As New Font(fnt1, 21.0F)
Dim fnt3 As New Font(fnt1, FontStyle.Bold Or FontStyle.Italic)
Dim fnt4 As New Font(fnt1.FontFamily, 18.0F, FontStyle.Regular)
投稿者 sakuto  (社会人) 投稿日時 2022/10/12 08:22:47
魔界の仮面弁士様

親コントロールの初期フォントから一括して変更する仕様を実装します。
ご教授ありがとうございました。