環境
- Visual Studio 2022 Community
- .NET 6.0
前提条件
単一のプロジェクトではなく,ソリューションの中にコンソールアプリケーション(以下,コンソールアプリ)のプロジェクトが保存されている.
はじめに
コンソールアプリのプロジェクトでは,フォームデザイナを使うことができない.「新しい項目の追加」ダイアログにも項目がない.
手打ちでフォームを作成するのは面倒くさいので代替案.
1. フォームアプリケーションのプロジェクトを追加
ソリューションに新しいプロジェクトとして「Windows フォーム アプリ」のプロジェクトを追加する.このプロジェクトにフォームを作成しておく.このときフレームワークのバージョンやターゲットOSなどは,既存のコンソールアプリのプロジェクトに揃える.
フォームとのデータのやり取りは,一番簡単な方法はフォームのクラスに Public
修飾子のメンバ変数を用意して使うこと.
2. プロジェクト参照の追加
コンソールアプリのプロジェクトに「プロジェクト 参照」として,フォームアプリのプロジェクトを追加する.
3. コンソールアプリでフォームを使う
まずメイン関数を修正する.(C# 10.0 の新しい記法は使用不可)
Project.cs
using FormApp; // フォームアプリのプロジェクト名
namespace ConsoleApp // コンソールアプリのプロジェクト名
{
internal class Program
{
// この属性をメイン関数の前に記述.
[STAThread]
static void Main()
{
// フォームを初期化して表示
Form1 form = new();
form.ShowDialog();
// フォームのインスタンスを破棄
form.Dispose();
}
}
}
おまけ. 見た目を綺麗にする
- XP Visual スタイルを有効化.(デフォルトだとWindows 98のような見た目)
- 高DPI環境でのスケーリング対応
コンソールアプリに「アプリケーション マニフェスト ファイル」を追加.デフォルトで色々書かれてると思うので以下の2箇所のコメントアウトを外す.
app.manifest
<!-- アプリケーションが DPI 対応であり、(以下略) -->
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
<longPathAware xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">true</longPathAware>
</windowsSettings>
</application>
<!-- Windows のコモン コントロールとダイアログのテーマを有効にします (Windows XP 以降) -->
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="*"
publicKeyToken="****************"
language="*"
/>
</dependentAssembly>
</dependency>