Windows Template Library

Windows Template Library (WTL) はマイクロソフトによるWin32をラップ（カプセル化）するオブジェクト指向のC++ライブラリ。WTLはプログラマが利用するAPIの1つである。MFCの軽量な代替として開発された。WTLはマイクロソフトのATL（COMやActiveXのためのもう1つの軽量API）を拡張する。
概要.
WTLは、小さくて高速なコードという大きな利点のあるATLに対して、アプリケーションや様々なUIコンポーネントの両方のために、より複雑なユーザーインターフェイスをサポートするようにATLを拡張するクラスのセットである。WTLのクラスは、ATLベースのアプリケーション、サーバ、コンポーネント、コントロールに対して、リッチなWin32ベースのUIを実装するための最適かつ簡単な方法であるように設計された。
WTLは、フレームやポップアップウィンドウを初めとして、MDI、標準・コモンコントロール、コモンダイアログ、プロパティシートやページ、GDIオブジェクト、UIのアップデート、スクロールバーウィンドウ、スプリッターウィンドウ、コマンドバーなど、様々なユーザーインターフェイスの要素をサポートする。WTLのクラスは主にテンプレートであり、最小限のインスタンスデータとインライン関数を使う。これらはフレームワークとしてデザインされたものではないため、特定のアプリケーションモデルを強制せず、どのようなスタイルでも受け入れられる。クラスはフックやスレッドローカルのメモリ領域を利用しないのでこれらのテクニックの押しつけに制約されない。これらには従属関係が無く、ストレートなSDKのコードと自由に混ぜることができる。要するに、WTLは、より論理的でオブジェクト指向的なモデルをプログラマに提供しつつも、SDKによるプログラムと比べてもサイズとスピードでほとんど遜色のない非常に小さくて効率的なコードを出力する。
WTLの多くのAPIは標準のWin32と直接的に対応しており、多くのWindowsプログラマーにとってなじみの深いインターフェイスである。しかしながらマイクロソフトによる公式のドキュメントは存在せず、この問題に立ち向かうため"WTL Documentation"プロジェクトがスタートしたが、でもまだドキュメントは完全ではない。
歴史.
マイクロソフトは2004年5月、オープンソースライセンスに基づいてWTLのソースコードを自由に利用できるようにした。マイクロソフトはSourceForge.netというインターネット上のオープンソースコードのためのリポジトリにソースコードを投稿し、Common Public Licenseに基づいてリリースした。このライブラリはバージョン7.5の時点で、Microsoft Permissive Licenseとのデュアルライセンスでもあった。
プログラム例.
Hello worldを表示するプログラムである。
// ATLヘッダー。
// WTLヘッダー。
class HelloWindow : public ATL::CWindowImpl<HelloWindow>
public:
 // ウィンドウクラス名を登録。
 DECLARE_WND_CLASS(TEXT("HelloWindow"));
private:
 // メッセージマップ。
 BEGIN_MSG_MAP(HelloWindow)
 MSG_WM_PAINT(OnPaint)
 MSG_WM_DESTROY(OnDestroy)
 END_MSG_MAP()
 // 描画メッセージのハンドラー。
 void OnPaint(HDC)
 WTL::CPaintDC dc(m_hWnd);
 dc.TextOut(10, 10, TEXT("Hello, world"), -1);
 // ウィンドウ破棄メッセージのハンドラー。
 void OnDestroy()
 PostQuitMessage(0);
};
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int nCmdShow)
 // ウィンドウのインタンスを生成。
 HelloWindow wnd;
 if (!wnd.Create(NULL, ATL::CWindow::rcDefault, TEXT("Hello, world"), WS_OVERLAPPEDWINDOW))
 return -1;
 // ウィンドウ表示。
 wnd.ShowWindow(nCmdShow);
 wnd.UpdateWindow();
 // メッセージループ。
 WTL::CMessageLoop msgLoop;
 return msgLoop.Run();