ATLでは、ウィンドウのスタイルは、CWinTraitsクラステンプレートによる「ウィンドウ特徴」として表現できます。
CWinTraitsクラステンプレートは、ウィンドウスタイルと拡張ウィンドウスタイルをサポートします。
これまでの例では、ウィンドウ作成時にCWindowImpl::Create()の第4引数でウィンドウスタイルを指定しました。
この第4引数は省略可能です。省略した場合は、次のように宣言されているCControlWinTraitsクラス
がデフォルト値として使用されます。
// atlwin.h
typedef CWinTraits<WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, 0>
CControlWinTraits;
|
これは、デフォルトでは子と兄弟をクリップする可視状態の子ウィンドウを作成することを意味します。
CControlWinTraitsクラスは、CWindowImplクラステンプレートの定義でデフォルトのテンプレート引数として
次のように使用されています。
// atlwin.h
template <class T,
class TBase /* = CWindow */,
class TWinTraits /* = CControlWinTraits */>
class ATL_NO_VTABLE CWindowImpl : public CWindowImplBaseT< TBase, TWinTraits >
|
このため、CWindowImplクラステンプレートの第3テンプレート引数に独自のウィンドウ特徴を指定することによって、
独自のウィンドウスタイルを指定することも可能です。
// デフォルトのウィンドウ特徴を持つウィンドウ(第2、第3テンプレート引数は省略可能)
class CDefaultWindow : public CWindowImpl<CDefaultWindow, CWindow, CControlWinTraits>
{...};
// 独自のウィンドウ特徴を持つウィンドウ
typedef CWinTraits<WS_OVERLAPPEDWINDOW | WS_VISIBLE, WS_EX_CLIENTEDGE> CMyTraits;
class CMyWindow : public CWindowImpl<CMyWindow, CWindow, CMyTraits>
{...};
|
なお、これらのテンプレート引数によるウィンドウ特徴は、CWindowImpl::Create()の
引数によってオーバーライドできます。
// 独自のウィンドウ特徴
typedef CWinTraits<WS_OVERLAPPEDWINDOW | WS_VISIBLE, 0> CMyTraits;
class CMyWindow : public CWindowImpl<CMyWindow, CWindow, CMyTraits>
{...};
// Createの第4引数を省略しているのでCMyTraitsが適用される
// つまりウィンドウはWS_OVERLAPPEDWINDOWとWS_VISIBLEスタイルを持つ
CMyWindow wnd1;
wnd1.Create(NULL, CWindow::rcDefault, _T("Hello"));
// Createの第4引数を指定しているのでウィンドウ特徴はオーバーライドされる
// つまりウィンドウはWS_OVERLAPPEDWINDOWスタイルのみを持つ
CMyWindow wnd2;
wnd2.Create(NULL, CWindow::rcDefault, _T("Hello"), WS_OVERLAPPEDWINDOW);
|
|