【実務・中級編】Windows Formsにおけるマニフェストファイルを活用した高DPI対応とVisual Studioテーマ(Windows 11スタイル)の強制適用 – Visual Basic (VB / VB.NET)解析バイブル

スポンサーリンク

レガシーからの脱却:VB.NET Windows Formsを「モダン」に仕立てる極限の作法

業務自動化ツールを開発する現場において、「見た目が古いから使いづらい」「画面を拡大すると文字が滲む」という不平は、単なる美意識の問題ではない。それはUXの欠如による生産性低下のサインだ。

Windows Formsは枯れた技術だが、設計の勘所を押さえればWindows 11のUIにも違和感なく溶け込む「戦えるモダンUI」へと昇華できる。今回は、マニフェストと高DPI対応という「UIの心臓部」を掌握し、堅牢なアプリを構築するための極意を伝授する。

—

1. なぜ「滲み」が起きるのか?:高DPI対応の真実

多くの開発者が陥る罠がある。それは「とりあえず画面をデザインして完成」という思考だ。Windowsのディスプレイ設定でスケール(125%や150%)を変更した瞬間、文字はぼやけ、レイアウトは崩壊する。

これを防ぐ唯一の解が、`app.manifest`による高DPI意識(Per-Monitor V2)の宣言だ。

実装手順:マニフェストの注入

1. Visual Studioのソリューションエクスプローラーでプロジェクトを右クリック。
2. 「追加」>「新しい項目」>「アプリケーション マニフェスト ファイル」を選択。
3. 生成された`app.manifest`内の以下のコメントを外し、有効化せよ。





PerMonitorV2
PerMonitorV2

エンジニアの知見: `PerMonitorV2`を指定することで、モニターごとに異なるDPI設定をOSが適切に処理する。これを怠れば、どんなに美しいボタンを配置しても「ぼやけた過去の遺物」に見える。

—

2. Windows 11スタイルを強制適用する:Visual Stylesの制御

Windows Formsのコントロールは、デフォルトでは「古臭いWindows 2000のような外観」になりがちだ。これを現代のOSテーマに追従させるには、アプリケーションの起動時に`EnableVisualStyles()`を呼び出す必要がある。

堅牢な起動エントリポイント(Program.vb)

`Sub Main`を明示的に定義し、UIのライフサイクルを制御するのがプロの設計だ。

Imports System.Windows.Forms

Public NotInheritable Class Program

Public Shared Sub Main()
‘ Windowsの視覚スタイル(モダンなボタンやスクロールバー等)を有効化
Application.EnableVisualStyles()
‘ テキストレンダリングの精度を向上
Application.SetCompatibleTextRenderingDefault(False)
‘ DPI対応を強制的にアプリケーション全体で適用
Application.SetHighDpiMode(HighDpiMode.PerMonitorV2)

‘ メインフォームの起動
Application.Run(New MainForm())
End Sub
End Class

—

3. 実務で「死なない」ためのUI設計の鉄則

UIをモダンにするのは第一歩に過ぎない。業務ツールとして保守性を維持するための、私が現場で徹底している設計原則を共有する。

① `TableLayoutPanel` を信仰せよ

座標指定(Location)での配置は、高DPI環境では悪夢を招く。必ず`TableLayoutPanel`や`FlowLayoutPanel`を使い、`Dock`や`Anchor`プロパティで柔軟に可変するレイアウトを組むこと。

② イベントハンドラにロジックを直書きしない

ボタンクリック時の処理にデータベース接続や計算ロジックを直書きするのは「技術的負債」の元だ。「画面(View)」と「処理(Logic)」を完全に分離せよ。

‘ 悪い例: ボタンの中に直接SQLを書く
Private Sub btnSave_Click(sender As Object, e As EventArgs) Handles btnSave.Click
‘ …ここに膨大なSQL処理… (絶対にダメ)
End Sub

‘ 良い例: サービス層を呼び出すだけ
Private Sub btnSave_Click(sender As Object, e As EventArgs) Handles btnSave.Click
Try
Dim service As New OrderService()
service.ProcessData(txtInput.Text)
MessageBox.Show(“保存完了”, “通知”, MessageBoxButtons.OK, MessageBoxIcon.Information)
Catch ex As Exception
‘ ログ出力とユーザーへの警告
Logger.Write(ex)
MessageBox.Show(ex.Message, “エラー”, MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Sub

—

最後に:エンジニアとしての矜持

Windows Formsは死んでいない。むしろ、そのシンプルさゆえに「正しい実装」を理解している者にとっては、最高の高速開発ツールだ。

今回伝授した「マニフェストによるDPI掌握」と「Program.vbでの初期化制御」は、いわばビルを建てる際の基礎工事だ。ここを疎かにして外観(見た目)だけ飾っても、長期間運用するうちに必ず綻びが出る。

「動けばいい」というコードから卒業し、「変更に強く、誰が見ても美しいコード」を書くこと。それが、真に業務を効率化するエンジニアへの道だ。健闘を祈る。

タイトルとURLをコピーしました