次の方法で共有


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

ウィンドウを実行するには、CWindowImplからクラスを派生します。、派生クラスでは、メッセージ マップとメッセージ ハンドラー関数を宣言します。3 種類の方法で、クラスを使用する:

  • 新しいウィンドウ クラスに基づいてウィンドウを作成します。

  • スーパークラス Windows の既存のクラス

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

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

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

[!メモ]

CWindowImpl では、DECLARE_WND_CLASS の ATL マクロには、Windows のクラス名を生成することを NULL を渡します。独自の名前を指定するには、の CWindowImplDECLARE_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を呼び出します。ウィンドウの元のウィンドウ プロシージャは、復元されます。

参照

関連項目

ウィンドウの実装