ATLでは、ウィンドウのスタイルは、CWinTraitsクラスによる「ウィンドウ特性」として表現できます。
CWinTraitsクラスは、ウィンドウスタイルと拡張ウィンドウスタイルをサポートします。
これまでの例では、ウィンドウ作成時にCWindowImpl::Create()の第4引数でウィンドウスタイルを指定しました。
この第4引数は省略可能です。省略した場合は、次のように宣言されているCControlWinTraitsクラス
がデフォルト値として使用されます。
typedef CWinTraits<WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, 0>
CControlWinTraits;
|
これは、デフォルトでは子と兄弟をクリップする可視状態の子ウィンドウを作成することを意味します。
CControlWinTraitsクラスは、CWindowImplクラスの定義でデフォルトのテンプレート引数として
次のように使用されています。
template <class T,
class TBase = CWindow,
class TWinTraits = CControlWinTraits>
class CWindowImpl : public ...
|
このため、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);
|
|