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

投稿で使用できる特殊コードの説明。(別タブで開きます。)
本名は入力しないようにしましょう。
投稿した後で削除するときに使うパスワードです。返答があった後は削除できません。
返答する人が目安にします。相手が小学生か社会人かで返答の仕方も変わります。
最初の投稿が質問の場合、質問者が解決時にチェックしてください。(以降も追加書き込み・返信は可能です。)
※「過去ログ」について書くときはその過去ログのURLも書いてください。

以下の返答は逆順(新しい順)に並んでいます。

投稿者 sakuto  (社会人) 投稿日時 2022/10/12 08:22:47
魔界の仮面弁士様

親コントロールの初期フォントから一括して変更する仕様を実装します。
ご教授ありがとうございました。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 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/6 13:37:30
魔界の仮面弁士様

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

返答に返すようで申し訳ないですが、フォントプロパティのサイズのみを残しフォントだけ変更できる
ことは可能でしょうか?フォントを変更しその後サイズを指定するコードしか思いつかなかったので。。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 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 08:40:10
VB.NETのアプリケーションで、あるボタンを押したときにあるフォーム上の全てのコントロールのフォントを一括変更したいのですが、どのような方法がありますか?