Windows Forms

Windows Formsはマイクロソフトの.NET Frameworkに含まれるグラフィカルユーザーインターフェイスAPIおよびアプリケーションフレームワークの名称である。日本語版の公式ドキュメント（旧MSDNライブラリ）では「Windowsフォーム」と表記されている。「WinForms」と略記されることもある。

**概要**
Windows FormsはWindows API（GDI/GDI+）をマネージコードでラップし、Windowsのユーザーインターフェイス要素へのアクセスを提供するアプリケーションフレームワークである。従来からVisual C++用に提供されていた、複雑なネイティブC++ベースのMFCや、旧Visual Basic（VB6）のフォームにとって代わるものとされる一方で、Windows FormsはMVCモデルを提供していない。また、シェル関連など一部のAPIに関してはラッパーが存在しないので、それらをWindows Formsで利用するためにはC++/CLI言語でラッパーアセンブリを作成するか、あるいはP/Invokeなどの手法を用いる必要がある。そのほか、MFCアプリケーションからWindows Formsコントロールを利用するなどのシナリオを想定した相互運用機能も用意されている。
Windows Formsアプリケーション開発にVisual Studioを利用することで、.NET以前のVisual BasicやDelphiのように、GUI（フォームデザイナー）で簡単かつ効率的に画面作成やGUI部品の詳細な設定を行なうことができる（RAD）。これは、GUI部品の簡単な配置や簡単な設定までしかできないWin32/MFCのリソースエディターやダイアログエディターとは大きく異なる。GUIによって作成したウィンドウレイアウト情報は、リソースファイルに変換されるのではなく、Visual Studio IDEによって直接C#やVisual Basic .NETなどのソースコードに変換して出力される（コード ビハインド）。マネージ言語はIDEとの親和性が高く、Windows Formsによって生産性の高いGUIアプリケーション開発環境が提供される。
なお、Windows Formsのターゲット環境はデスクトップ アプリケーションであり、ブラウザで動作するWebアプリケーションを開発するにはASP.NETなどを利用することになる。

**コード例**
C#によるWindows Formsを使用したHello worldプログラムの例である。ここで、System.Windows.FormsがWindows Formsの名前空間を表す。
using System;
using System.Windows.Forms;
public class HelloWorld
{
STAThread
public static void Main()
{
Form form = new Form();
form.Text = "Hello world!";
Application.Run(form);
}
}

**ソースコード**
基本クラスライブラリをはじめとする.NET FrameworkのソースコードはMicrosoftリファレンスソースライセンス (MS-RSL) に基づいて公開されている。この中にWindows Formsも含まれている。もともと.NET Frameworkはプロプライエタリでソースコードは公開されていなかったが、2007年に.NET Framework 3.5の発表に合わせて公開された。.NET（旧称.NET Core）のソースコードはMITライセンスに基づいて公開されており、Windows Formsも含まれている。
Windows Formsのソースコードの大半はC#を使って記述されており、P/InvokeやCOM相互運用を利用してWindows APIを呼び出しているが、一部の実装にVB.NETも使われている。ネイティブ相互運用のテストコードにはC++も使われている。

**互換実装**
マイクロソフトによるWindows専用の.NET Frameworkベース公式実装のほか、Monoによる互換実装（通称WinForms）が存在する。MonoのWinFormsは.NET 1.1/2.0互換の実装を提供するが、2017年現在の開発状況はメンテナンスフェイズとなっている。

**課題と将来性**
Windows Formsは.NET Framework 1.0のリリースとともに登場したが、.NET 2.0で機能追加や仕様変更がなされた後は大きな変化がない。.NET 3.0で導入され、Windowsのバージョンアップとともに継続的に機能追加がなされた後発のデスクトップアプリケーションフレームワークであるWPFに比べると、マルチタッチやDPI Awareなどに標準で対応していないなど、最新の技術動向は反映されにくい傾向にある。.NET 4.5.1, .NET 4.5.2, .NET 4.6, .NET 4.7ではそれぞれ高DPI環境下でのWindows Formsコントロールのリサイズに関する機能が徐々に拡張・改善されているが、既定ではなくオプトインである。
また、Visual C++にはバージョン2010までWindows Formsのアプリケーションプロジェクトテンプレートが存在していたが、バージョン2012以降は削除されている。もともとVisual C++においてマネージコンポーネントであるWindows Formsを扱うにはC++/CLI言語を使用する必要があったが、C++/CLIはマネージコードとアンマネージコードの相互運用を行なうグルー言語用途としてのみ使用することが推奨されている。
しかし、後継となるWPFはMFCやWindows Formsの完全なスーパーセットではなく、一部は同等機能が用意されていない。Win32/MFCやWindows Formsで作成されたコード資産を再利用するため、WPFアプリケーションでもWin32/MFCやWindows Formsとの連携を行なうシナリオを想定した相互運用機能が用意されている。
.NET Core 3.0では、Windows版限定ではあるがWPFとともにWindows Formsが実装された。.NET Frameworkのメジャーアップデートは4.8で最後となるが、メンテナンスは継続される。
.NET Frameworkと.NET Core双方の後継となる.NET 5のWindows Formsでは、Windows Vistaで導入されたタスクダイアログのラッパークラスや、強化されたWin32リストビュー機能へのアクセスAPIが追加されるなど、オープンソース開発コミュニティによるプルリクエストを取り込んだ新機能が導入された。.NET 6/7/8でも新機能がいくつか追加されており、.NET 9でも新機能の実装が予定されている。

**脚注**

**関連項目**
 基本クラスライブラリ- Visual Component Library- Windows Presentation Foundation

**外部リンク**
  Microsoft Reference Source (#System.Windows.Forms): .NET Framework内のソースコード。MS-RSL。- link=no: .NET（当時.NET Core 3.0）向けに移植されたバージョン。MITライセンス。