CWindowImpl によるウィンドウの実装
ウィンドウを実行するには、CWindowImplからクラスを派生します。、派生クラスでは、メッセージ マップとメッセージ ハンドラー関数を宣言します。3 種類の方法で、クラスを使用する:
新しいウィンドウ クラスに基づいてウィンドウを作成します。
スーパークラス Windows の既存のクラス
サブクラス既存のウィンドウ
新しいウィンドウ クラスに基づくウィンドウを作成します
CWindowImpl は、Windows のクラス情報を宣言するに DECLARE_WND_CLASS のマクロが含まれています。このマクロは、新しいウィンドウ クラス情報を定義するに CWndClassInfo を使用する GetWndClassInfo 関数を実装します。CWindowImpl::Create が呼び出されると、Windows のこのクラスは、登録され、新しいウィンドウが作成されます。
[!メモ]
CWindowImpl では、DECLARE_WND_CLASS の ATL マクロには、Windows のクラス名を生成することを NULL を渡します。独自の名前を指定するには、の CWindowImplの DECLARE_WND_CLASS に文字列-派生クラスを渡します。
使用例
次に、新しいウィンドウ クラスに基づいてウィンドウを実装するクラスの例です:
class CMyCustomWnd : public CWindowImpl<CMyCustomWnd>
{
public:
// Optionally specify name of the new Windows class
DECLARE_WND_CLASS(_T("MyName"))
// If this macro is not specified in your
// class, ATL will generate a class name
BEGIN_MSG_MAP(CMyCustomWnd)
MESSAGE_HANDLER(WM_PAINT, OnPaint)
END_MSG_MAP()
LRESULT OnPaint(UINT /*nMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/,
BOOL& /*bHandled*/)
{
// Do some painting code
return 0;
}
};
ウィンドウを作成するには、CMyWindow のインスタンスを作成し、[作成] のメソッドを呼び出します。
[!メモ]
既定のウィンドウ クラス情報をオーバーライドするには、適切な値へ CWndClassInfo のメンバーを設定することによって、派生クラスの GetWndClassInfo のメソッドを実装します。
以下は、標準エディット コントロールをスーパークラス化するクラスの例です:
class CMyEdit : public CWindowImpl<CMyEdit>
{
public:
// "Edit" is the name of the standard Windows class.
// "MyEdit" is the name of the new Windows class
// that will be based on the Edit class.
DECLARE_WND_SUPERCLASS(_T("MyEdit"), _T("Edit"))
BEGIN_MSG_MAP(CMyEdit)
MESSAGE_HANDLER(WM_CHAR, OnChar)
END_MSG_MAP()
LRESULT OnChar(UINT /*nMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/,
BOOL& /*bHandled*/)
{
// Do some character handling code
return 0;
}
};
スーパークラス化された編集ウィンドウを作成するには、CMyEdit のインスタンスを作成し、[作成] のメソッドを呼び出します。
Windows の既存のクラスのスーパークラス化
DECLARE_WND_SUPERCLASS のマクロは、スーパークラス Windows の既存のウィンドウ クラスを作成することができます。このマクロで CWindowImpl、の派生クラスを指定します。他の ATL ウィンドウと同様に、メッセージは、メッセージ マップによって処理されます。
DECLARE_WND_SUPERCLASSを使用すると、新しいウィンドウ クラスは登録されます。この新しいクラスは、既存のクラスを CWindowImpl::WindowProc と指定し、ウィンドウ プロシージャを置き換える同じです (またはこのメソッドをオーバーライドする) と、関数。
既存のウィンドウのサブクラス化
サブクラスに既存のウィンドウは CWindowImpl からクラスを派生し、2 種類の前の場合のようにメッセージ マップを宣言します。ただし、サブクラス既存のウィンドウため、Windows のクラス情報を指定していないので注意してください。
**[作成]**を呼び出す代わりに、SubclassWindow を呼び出して、サブクラスにするには、既存のウィンドウ ハンドルを渡します。ウィンドウがサブクラス化、CWindowImpl::WindowProc (またはこのメソッドをオーバーライドするメッセージ マップにメッセージを指示するには、関数を使用します。、オブジェクトからサブクラス化されたウィンドウをデタッチするには、UnsubclassWindowを呼び出します。ウィンドウの元のウィンドウ プロシージャは、復元されます。