次の方法で共有


CWindowImpl によるウィンドウの実装

更新 : 2007 年 11 月

ウィンドウを実装するには、CWindowImpl の派生クラスを作成します。派生クラスでは、メッセージ マップとメッセージ ハンドラ関数を宣言します。作成したクラスは、次の 3 とおりの方法で使用できます。

  • 新しいウィンドウ クラスに基づくウィンドウの作成

  • 既存のウィンドウ クラスのスーパークラス化

  • 既存のウィンドウのサブクラス化

新しいウィンドウ クラスに基づくウィンドウの作成

CWindowImpl には、ウィンドウ クラスの情報を宣言する DECLARE_WND_CLASS マクロが用意されています。このマクロは、GetWndClassInfo 関数を実装し、CWndClassInfo を使用して新しいウィンドウ クラスの情報を定義します。CWindowImpl::Create を呼び出すと、このウィンドウ クラスが登録され、新しいウィンドウが作成されます。

s420ff40.alert_note(ja-jp,VS.90).gifメモ :

CWindowImpl は、DECLARE_WND_CLASS マクロに NULL を渡します。つまり、ATL がウィンドウ クラス名を生成します。独自の名前を指定する場合は、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 のインスタンスを作成してから Create メソッドを呼び出します。

s420ff40.alert_note(ja-jp,VS.90).gifメモ :

既定のウィンドウ クラス情報をオーバーライドするには、CWndClassInfo の各メンバを適切な値に設定して、派生クラスの GetWndClassInfo メソッドを実装してください。

標準的な Edit クラスをスーパークラス化するクラスの例を次に示します。

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;
   }
};

Edit をスーパークラス化したウィンドウを作成するには、CMyEdit のインスタンスを作成してから Create メソッドを呼び出します。

既存のウィンドウ クラスのスーパークラス化

DECLARE_WND_SUPERCLASS マクロを使用すると、既存のウィンドウをスーパークラス化するウィンドウを作成できます。このマクロを CWindowImpl の派生クラスで指定します。ほかの ATL ウィンドウと同様に、メッセージはメッセージ マップによって処理されます。

DECLARE_WND_SUPERCLASS を使用すると、新しいウィンドウ クラスが登録されます。この新しいクラスは、指定した既存のクラスと同じですが、ウィンドウ プロシージャは CWindowImpl::WindowProc または CWindowImpl::WindowProc をオーバーライドする関数に置き換えられます。

既存のウィンドウのサブクラス化

既存のウィンドウをサブクラス化するには、前の 2 つの方法と同じように、CWindowImpl の派生クラスを作成し、メッセージ マップを宣言します。ただし、既存のウィンドウをサブクラス化するため、ウィンドウ クラスの情報は指定しません。

Create の代わりに SubclassWindow を呼び出し、サブクラス化する既存のウィンドウを識別するハンドルを SubclassWindow に渡します。サブクラス化されたウィンドウは、CWindowImpl::WindowProc またはこのメソッドをオーバーライドする関数を使用して、メッセージ マップにメッセージを送ります。サブクラス化されたウィンドウをオブジェクトから切り離すには、UnsubclassWindow を呼び出します。切り離すと、ウィンドウの元のウィンドウ プロシージャが復元されます。

参照

参照

ウィンドウの実装