メッセージ マップ マクロ (ATL)

これらのマクロでは、メッセージ マップおよびエントリを定義します。

名前 説明
ALT_MSG_MAP 代替メッセージ マップの先頭をマークします。
BEGIN_MSG_MAP 既定のメッセージ マップの先頭をマークします。
CHAIN_MSG_MAP_ALT 基本クラスの代替メッセージ マップにチェーンします。
CHAIN_MSG_MAP_ALT_MEMBER クラスのデータ メンバー内の代替メッセージ マップにチェーンします。
CHAIN_MSG_MAP 基本クラスの既定のメッセージ マップにチェーンします。
CHAIN_MSG_MAP_DYNAMIC 実行時に別のクラスのメッセージ マップにチェーンします。
CHAIN_MSG_MAP_MEMBER クラスのデータ メンバー内の既定のメッセージ マップにチェーンします。
COMMAND_CODE_HANDLER 通知コードに基づいて、WM_COMMAND メッセージをハンドラー関数にマップします。
COMMAND_HANDLER 通知コードと、メニュー項目、コントロール、またはアクセラレータの識別子に基づいて、WM_COMMAND メッセージをハンドラー関数にマップします。
COMMAND_ID_HANDLER メニュー項目、コントロール、またはアクセラレータの識別子に基づいて、WM_COMMAND メッセージをハンドラー関数にマップします。
COMMAND_RANGE_CODE_HANDLER 通知コードと、連続する範囲のコントロール識別子に基づいて、WM_COMMAND メッセージをハンドラー関数にマップします。
COMMAND_RANGE_HANDLER 連続する範囲のコントロール識別子に基づいて、WM_COMMAND メッセージをハンドラー関数にマップします。
DECLARE_EMPTY_MSG_MAP 空のメッセージ マップを実装します。
DEFAULT_REFLECTION_HANDLER このマクロなしには処理されない、反映されたメッセージの既定のハンドラーを指定します。
END_MSG_MAP メッセージ マップの末尾をマークします。
FORWARD_NOTIFICATIONS 通知メッセージを親ウィンドウに転送します。
MESSAGE_HANDLER Windows メッセージをハンドラー関数にマップします。
MESSAGE_RANGE_HANDLER 連続する範囲の Windows メッセージをハンドラー関数にマップします。
NOTIFY_CODE_HANDLER 通知コードに基づいて、WM_NOTIFY メッセージをハンドラー関数にマップします。
NOTIFY_HANDLER 通知コードとコントロール識別子に基づいて、WM_NOTIFY メッセージをハンドラー関数にマップします。
NOTIFY_ID_HANDLER コントロール識別子に基づいて、WM_NOTIFY メッセージをハンドラー関数にマップします。
NOTIFY_RANGE_CODE_HANDLER 通知コードと、連続する範囲のコントロール識別子に基づいて、WM_NOTIFY メッセージをハンドラー関数にマップします。
NOTIFY_RANGE_HANDLER 連続する範囲のコントロール識別子に基づいて、WM_NOTIFY メッセージをハンドラー関数にマップします。
REFLECT_NOTIFICATIONS 通知メッセージを送信元のウィンドウに反映します。
REFLECTED_COMMAND_CODE_HANDLER 通知コードに基づいて、反映された WM_COMMAND メッセージをハンドラー関数にマップします。
REFLECTED_COMMAND_HANDLER 通知コードと、メニュー項目、コントロール、またはアクセラレータの識別子に基づいて、反映された WM_COMMAND メッセージをハンドラー関数にマップします。
REFLECTED_COMMAND_ID_HANDLER メニュー項目、コントロール、またはアクセラレータの識別子に基づいて、反映された WM_COMMAND メッセージをハンドラー関数にマップします。
REFLECTED_COMMAND_RANGE_CODE_HANDLER 通知コードと、連続する範囲のコントロール識別子に基づいて、反映された WM_COMMAND メッセージをハンドラー関数にマップします。
REFLECTED_COMMAND_RANGE_HANDLER 連続する範囲のコントロール識別子に基づいて、反映された WM_COMMAND メッセージをハンドラー関数にマップします。
REFLECTED_NOTIFY_CODE_HANDLER 通知コードに基づいて、反映された WM_NOTIFY メッセージをハンドラー関数にマップします。
REFLECTED_NOTIFY_HANDLER 通知コードとコントロール識別子に基づいて、反映された WM_NOTIFY メッセージをハンドラー関数にマップします。
REFLECTED_NOTIFY_ID_HANDLER コントロール識別子に基づいて、反映された WM_NOTIFY メッセージをハンドラー関数にマップします。
REFLECTED_NOTIFY_RANGE_CODE_HANDLER 通知コードと、連続する範囲のコントロール識別子に基づいて、反映された WM_NOTIFY メッセージをハンドラー関数にマップします。
REFLECTED_NOTIFY_RANGE_HANDLER 連続する範囲のコントロール識別子に基づいて、反映された WM_NOTIFY メッセージをハンドラー関数にマップします。

必要条件

ヘッダー: atlwin.h

ALT_MSG_MAP

代替メッセージ マップの先頭をマークします。

ALT_MSG_MAP(msgMapID)

パラメーター

msgMapID
[入力] メッセージ マップの識別子。

解説

ATL では、各メッセージ マップが数値で識別されます。 既定のメッセージ マップ (BEGIN_MSG_MAP マクロで宣言されます) は 0 で識別されます。 代替メッセージ マップは、msgMapID で識別されます。

メッセージ マップは、ウィンドウに送信されるメッセージを処理するのに使用されます。 たとえば、CContainedWindow を使用すると、含まれているオブジェクト内のメッセージ マップの識別子を指定できます。 CContainedWindow::WindowProc では、その後、このメッセージ マップを使用して、含まれているウィンドウのメッセージを適切なハンドラー関数または別のメッセージ マップに送信します。 ハンドラー関数を宣言するマクロの一覧については、「BEGIN_MSG_MAP」を参照してください。

メッセージ マップは、常に BEGIN_MSG_MAP から開始します。 その後、後続の代替メッセージ マップを宣言できます。

END_MSG_MAP マクロでは、メッセージ マップの末尾をマークします。 BEGIN_MSG_MAP と END_MSG_MAP のインスタンスは常に 1 つだけです。

ATL でメッセージ マップを使用する方法の詳細については、「メッセージ マップ」を参照してください。

次の例は、既定のメッセージ マップと 1 つの代替メッセージ マップを示しています。それぞれに 1 つのハンドラー関数が含まれています。

BEGIN_MSG_MAP(CMyOneAltClass)
   MESSAGE_HANDLER(WM_PAINT, OnPaint)
ALT_MSG_MAP(1)
   MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)
END_MSG_MAP()

次の例は、2 つの代替メッセージ マップを示しています。 既定のメッセージ マップは空です。

BEGIN_MSG_MAP(CMyClass)
ALT_MSG_MAP(1)
   MESSAGE_HANDLER(WM_PAINT, OnPaint)
   MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)
ALT_MSG_MAP(2)
   MESSAGE_HANDLER(WM_CREATE, OnCreate)
END_MSG_MAP()

必要条件

ヘッダー: atlwin.h

BEGIN_MSG_MAP

既定のメッセージ マップの先頭をマークします。

BEGIN_MSG_MAP(theClass)

パラメーター

theClass
[入力] メッセージ マップを含むクラスの名前。

解説

CWindowImpl::WindowProc では、既定のメッセージ マップを使用して、ウィンドウに送信されたメッセージを処理します。 メッセージ マップにより、メッセージが適切なハンドラー関数または別のメッセージ マップに送信されます。

次のマクロでは、メッセージをハンドラー関数にマップします。 この関数は、theClass で定義する必要があります。

マクロ 説明
MESSAGE_HANDLER Windows メッセージをハンドラー関数にマップします。
MESSAGE_RANGE_HANDLER 連続する範囲の Windows メッセージをハンドラー関数にマップします。
COMMAND_HANDLER 通知コードと、メニュー項目、コントロール、またはアクセラレータの識別子に基づいて、WM_COMMAND メッセージをハンドラー関数にマップします。
COMMAND_ID_HANDLER メニュー項目、コントロール、またはアクセラレータの識別子に基づいて、WM_COMMAND メッセージをハンドラー関数にマップします。
COMMAND_CODE_HANDLER 通知コードに基づいて、WM_COMMAND メッセージをハンドラー関数にマップします。
COMMAND_RANGE_HANDLER メニュー項目、コントロール、またはアクセラレータの識別子に基づいて、連続する範囲の WM_COMMAND メッセージをハンドラー関数にマップします。
NOTIFY_HANDLER 通知コードとコントロール識別子に基づいて、WM_NOTIFY メッセージをハンドラー関数にマップします。
NOTIFY_ID_HANDLER コントロール識別子に基づいて、WM_NOTIFY メッセージをハンドラー関数にマップします。
NOTIFY_CODE_HANDLER 通知コードに基づいて、WM_NOTIFY メッセージをハンドラー関数にマップします。
NOTIFY_RANGE_HANDLER コントロール識別子に基づいて、連続する範囲の WM_NOTIFY メッセージをハンドラー関数にマップします。

次のマクロでは、メッセージを別のメッセージ マップに送信します。 このプロセスは、"チェーン" と呼ばれます。

マクロ 説明
CHAIN_MSG_MAP 基本クラスの既定のメッセージ マップにチェーンします。
CHAIN_MSG_MAP_MEMBER クラスのデータ メンバー内の既定のメッセージ マップにチェーンします。
CHAIN_MSG_MAP_ALT 基本クラスの代替メッセージ マップにチェーンします。
CHAIN_MSG_MAP_ALT_MEMBER クラスのデータ メンバー内の代替メッセージ マップにチェーンします。
CHAIN_MSG_MAP_DYNAMIC 実行時に別のクラスの既定のメッセージ マップにチェーンします。

次のマクロでは、親ウィンドウから "反映された" メッセージを直接送信します。 たとえば、通常、コントロールによって通知メッセージが処理のために親ウィンドウに送信されますが、親ウィンドウではこのメッセージをコントロールに反映できます。

マクロ 説明
REFLECTED_COMMAND_HANDLER 通知コードと、メニュー項目、コントロール、またはアクセラレータの識別子に基づいて、反映された WM_COMMAND メッセージをハンドラー関数にマップします。
REFLECTED_COMMAND_ID_HANDLER メニュー項目、コントロール、またはアクセラレータの識別子に基づいて、反映された WM_COMMAND メッセージをハンドラー関数にマップします。
REFLECTED_COMMAND_CODE_HANDLER 通知コードに基づいて、反映された WM_COMMAND メッセージをハンドラー関数にマップします。
REFLECTED_COMMAND_RANGE_HANDLER 連続する範囲のコントロール識別子に基づいて、反映された WM_COMMAND メッセージをハンドラー関数にマップします。
REFLECTED_COMMAND_RANGE_CODE_HANDLER 通知コードと、連続する範囲のコントロール識別子に基づいて、反映された WM_COMMAND メッセージをハンドラー関数にマップします。
REFLECTED_NOTIFY_HANDLER 通知コードとコントロール識別子に基づいて、反映された WM_NOTIFY メッセージをハンドラー関数にマップします。
REFLECTED_NOTIFY_ID_HANDLER コントロール識別子に基づいて、反映された WM_NOTIFY メッセージをハンドラー関数にマップします。
REFLECTED_NOTIFY_CODE_HANDLER 通知コードに基づいて、反映された WM_NOTIFY メッセージをハンドラー関数にマップします。
REFLECTED_NOTIFY_RANGE_HANDLER 連続する範囲のコントロール識別子に基づいて、反映された WM_NOTIFY メッセージをハンドラー関数にマップします。
REFLECTED_NOTIFY_RANGE_CODE_HANDLER 通知コードと、連続する範囲のコントロール識別子に基づいて、反映された WM_NOTIFY メッセージをハンドラー関数にマップします。

class CMyExtWindow : public CMyBaseWindow
{
public:
   BEGIN_MSG_MAP(CMyExtWindow)
      MESSAGE_HANDLER(WM_PAINT, OnPaint)
      MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)
      CHAIN_MSG_MAP(CMyBaseWindow)
   END_MSG_MAP()

   LRESULT OnPaint(UINT /*nMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, 
      BOOL& /*bHandled*/)
   {
      return 0;   
   }

   LRESULT OnSetFocus(UINT /*nMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, 
      BOOL& /*bHandled*/) 
   {
      return 0;   
   }
};

CMyExtWindow オブジェクトで WM_PAINT メッセージが受信されると、このメッセージは実際の処理のために CMyExtWindow::OnPaint に送信されます。 OnPaint により、メッセージにさらに処理が必要であると示される場合、メッセージは CMyBaseWindow の既定のメッセージ マップに送信されます。

既定のメッセージ マップに加えて、ALT_MSG_MAP を使用して代替メッセージ マップを定義できます。 メッセージ マップは、常に BEGIN_MSG_MAP から開始します。 その後、後続の代替メッセージ マップを宣言できます。 次の例は、既定のメッセージ マップと 1 つの代替メッセージ マップを示しています。それぞれに 1 つのハンドラー関数が含まれています。

BEGIN_MSG_MAP(CMyOneAltClass)
   MESSAGE_HANDLER(WM_PAINT, OnPaint)
ALT_MSG_MAP(1)
   MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)
END_MSG_MAP()

次の例は、2 つの代替メッセージ マップを示しています。 既定のメッセージ マップは空です。

BEGIN_MSG_MAP(CMyClass)
ALT_MSG_MAP(1)
   MESSAGE_HANDLER(WM_PAINT, OnPaint)
   MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)
ALT_MSG_MAP(2)
   MESSAGE_HANDLER(WM_CREATE, OnCreate)
END_MSG_MAP()

END_MSG_MAP マクロでは、メッセージ マップの末尾をマークします。 BEGIN_MSG_MAP と END_MSG_MAP のインスタンスは常に 1 つだけです。

ATL でメッセージ マップを使用する方法の詳細については、「メッセージ マップ」を参照してください。

必要条件

ヘッダー: atlwin.h

CHAIN_MSG_MAP_ALT

メッセージ マップ内のエントリを定義します。

CHAIN_MSG_MAP_ALT(theChainClass, msgMapID)

パラメーター

theChainClass
[入力] メッセージ マップを含む基本クラスの名前。

msgMapID
[入力] メッセージ マップの識別子。

解説

CHAIN_MSG_MAP_ALT では、メッセージを基本クラスの代替メッセージ マップに送信します。 ALT_MSG_MAP(msgMapID) を使用して、この代替メッセージ マップを宣言している必要があります。 メッセージを基本クラスの既定のメッセージ マップ (BEGIN_MSG_MAP を使用して宣言されます) に送信するには、CHAIN_MSG_MAP を使用します。 例については、「CHAIN_MSG_MAP」を参照してください。

Note

メッセージ マップは、常に BEGIN_MSG_MAP から開始します。 その後、ALT_MSG_MAP を使用して、後続の代替メッセージ マップを宣言できます。 END_MSG_MAP マクロでは、メッセージ マップの末尾をマークします。 すべてのメッセージ マップには、BEGIN_MSG_MAP と END_MSG_MAP のインスタンスを 1 つだけ指定する必要があります。

ATL でメッセージ マップを使用する方法の詳細については、「メッセージ マップ」を参照してください。

必要条件

ヘッダー: atlwin.h

CHAIN_MSG_MAP_ALT_MEMBER

メッセージ マップ内のエントリを定義します。

CHAIN_MSG_MAP_ALT_MEMBER(theChainMember, msgMapID)

パラメーター

theChainMember
[入力] からメッセージ マップを含むデータ メンバーの名前。

msgMapID
[入力] メッセージ マップの識別子。

解説

CHAIN_MSG_MAP_ALT_MEMBER では、メッセージをデータ メンバーの代替メッセージ マップに送信します。 ALT_MSG_MAP(msgMapID) を使用して、この代替メッセージ マップを宣言している必要があります。 メッセージをデータ メンバーの既定のメッセージ マップ (BEGIN_MSG_MAP を使用して宣言されます) に送信するには、CHAIN_MSG_MAP_MEMBER を使用します。 例については、「CHAIN_MSG_MAP_MEMBER」を参照してください。

Note

メッセージ マップは、常に BEGIN_MSG_MAP から開始します。 その後、ALT_MSG_MAP を使用して、後続の代替メッセージ マップを宣言できます。 END_MSG_MAP マクロでは、メッセージ マップの末尾をマークします。 すべてのメッセージ マップには、BEGIN_MSG_MAP と END_MSG_MAP のインスタンスを 1 つだけ指定する必要があります。

ATL でメッセージ マップを使用する方法の詳細については、「メッセージ マップ」を参照してください。

必要条件

ヘッダー: atlwin.h

CHAIN_MSG_MAP

メッセージ マップ内のエントリを定義します。

CHAIN_MSG_MAP(theChainClass)

パラメーター

theChainClass
[入力] メッセージ マップを含む基本クラスの名前。

解説

CHAIN_MSG_MAP では、メッセージを基本クラスの既定のメッセージ マップ (BEGIN_MSG_MAP を使用して宣言されます) に送信します。 メッセージを基本クラスの代替メッセージ マップ (ALT_MSG_MAP を使用して宣言されます) に送信するには、CHAIN_MSG_MAP_ALT を使用します。

Note

メッセージ マップは、常に BEGIN_MSG_MAP から開始します。 その後、ALT_MSG_MAP を使用して、後続の代替メッセージ マップを宣言できます。 END_MSG_MAP マクロでは、メッセージ マップの末尾をマークします。 すべてのメッセージ マップには、BEGIN_MSG_MAP と END_MSG_MAP のインスタンスを 1 つだけ指定する必要があります。

ATL でメッセージ マップを使用する方法の詳細については、「メッセージ マップ」を参照してください。

class CMyExtClass : public CMyBaseClass
{
public:
  BEGIN_MSG_MAP(CMyExtClass)
     MESSAGE_HANDLER(WM_PAINT, OnPaint)
     // chain to default message map in CMyBaseClass
     CHAIN_MSG_MAP(CMyBaseClass)
  ALT_MSG_MAP(1)
     // chain to first alternative message map in CMyBaseClass
     CHAIN_MSG_MAP(CMyBaseClass)
  ALT_MSG_MAP(2)
     MESSAGE_HANDLER(WM_CHAR, OnChar)
     // chain to alternate message map in CMyBaseClass
     CHAIN_MSG_MAP_ALT(CMyBaseClass, 1)
  END_MSG_MAP()

   LRESULT OnPaint(UINT /*nMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, 
      BOOL& /*bHandled*/)
   {
      return 0;   
   }

   LRESULT OnChar(UINT /*nMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, 
      BOOL& /*bHandled*/)
   {
      return 0;   
   }
};

この例は、次の内容を示しています。

  • ウィンドウ プロシージャで CMyClass の既定のメッセージ マップが使用されており、OnPaint によってメッセージが処理されない場合、メッセージは、処理のために CMyBaseClass の既定のメッセージ マップに送信されます。

  • ウィンドウ プロシージャで CMyClass の最初の代替メッセージ マップが使用されている場合は、すべてのメッセージが CMyBaseClass の既定のメッセージ マップに送信されます。

  • ウィンドウ プロシージャで CMyClass の 2 番目の代替メッセージ マップが使用されており、OnChar によってメッセージが処理されない場合、メッセージは CMyBaseClass の特定の代替メッセージ マップに送信されます。 CMyBaseClass では、ALT_MSG_MAP(1) を使用してこのメッセージ マップを宣言している必要があります。

必要条件

ヘッダー: atlwin.h

CHAIN_MSG_MAP_DYNAMIC

メッセージ マップ内のエントリを定義します。

CHAIN_MSG_MAP_DYNAMIC(dynaChainID)

パラメーター

dynaChainID
[入力] オブジェクトのメッセージ マップの一意の識別子。

解説

CHAIN_MSG_MAP_DYNAMIC では、実行時にメッセージを別のオブジェクトの既定のメッセージ マップに送信します。 オブジェクトとそのメッセージ マップは、CDynamicChain::SetChainEntry を使用して定義する dynaChainID に関連付けられています。 CHAIN_MSG_MAP_DYNAMIC を使用するには、CDynamicChain からクラスを派生させる必要があります。 例については、CDynamicChain の概要を参照してください。

Note

メッセージ マップは、常に BEGIN_MSG_MAP から開始します。 その後、ALT_MSG_MAP を使用して、後続の代替メッセージ マップを宣言できます。 END_MSG_MAP マクロでは、メッセージ マップの末尾をマークします。 すべてのメッセージ マップには、BEGIN_MSG_MAP と END_MSG_MAP のインスタンスを 1 つだけ指定する必要があります。

ATL でメッセージ マップを使用する方法の詳細については、「メッセージ マップ」を参照してください。

必要条件

ヘッダー: atlwin.h

CHAIN_MSG_MAP_MEMBER

メッセージ マップ内のエントリを定義します。

CHAIN_MSG_MAP_MEMBER(theChainMember)

パラメーター

theChainMember
[入力] からメッセージ マップを含むデータ メンバーの名前。

解説

CHAIN_MSG_MAP_MEMBER では、メッセージをデータ メンバーの既定のメッセージ マップ (BEGIN_MSG_MAP を使用して宣言されます) に送信します。 メッセージをデータ メンバーの代替メッセージ マップ (ALT_MSG_MAP を使用して宣言されます) に送信するには、CHAIN_MSG_MAP_ALT_MEMBER を使用します。

Note

メッセージ マップは、常に BEGIN_MSG_MAP から開始します。 その後、ALT_MSG_MAP を使用して、後続の代替メッセージ マップを宣言できます。 END_MSG_MAP マクロでは、メッセージ マップの末尾をマークします。 すべてのメッセージ マップには、BEGIN_MSG_MAP と END_MSG_MAP のインスタンスを 1 つだけ指定する必要があります。

ATL でメッセージ マップを使用する方法の詳細については、「メッセージ マップ」を参照してください。

class CMyContainerClass : public CWindowImpl<CMyContainerClass>
{
public:
   CMyContainedClass m_obj;

   BEGIN_MSG_MAP(CMyContainerClass)
      MESSAGE_HANDLER(WM_PAINT, OnPaint)
      // chain to default message map of m_obj
      CHAIN_MSG_MAP_MEMBER(m_obj)
   ALT_MSG_MAP(1)
      // chain to default message map of m_obj
      CHAIN_MSG_MAP_MEMBER(m_obj)
   ALT_MSG_MAP(2)
      MESSAGE_HANDLER(WM_CHAR, OnChar)
      // chain to alternate message map of m_obj
      CHAIN_MSG_MAP_ALT_MEMBER(m_obj, 1)
   END_MSG_MAP()

   LRESULT OnPaint(UINT /*nMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, 
      BOOL& /*bHandled*/)
   {
      return 0;   
   }
   LRESULT OnChar(UINT /*nMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, 
      BOOL& /*bHandled*/)
   {
      return 0;   
   }
};

この例は、次の内容を示しています。

  • ウィンドウ プロシージャで CMyClass の既定のメッセージ マップが使用されており、OnPaint によってメッセージが処理されない場合、メッセージは、処理のために m_obj の既定のメッセージ マップに送信されます。

  • ウィンドウ プロシージャで CMyClass の最初の代替メッセージ マップが使用されている場合は、すべてのメッセージが m_obj の既定のメッセージ マップに送信されます。

  • ウィンドウ プロシージャで CMyClass の 2 番目の代替メッセージ マップが使用されており、OnChar によってメッセージが処理されない場合、メッセージは m_obj の特定の代替メッセージ マップに送信されます。 CMyContainedClass クラスでは、ALT_MSG_MAP(1) を使用してこのメッセージ マップを宣言している必要があります。

必要条件

ヘッダー: atlwin.h

COMMAND_CODE_HANDLER

COMMAND_HANDLER に似ていますが、通知コードにのみ基づいて WM_COMMAND メッセージをマップします。

COMMAND_CODE_HANDLER(code, func)

パラメーター

code
[入力] 通知コード。

func
[入力] メッセージ ハンドラー関数の名前。

必要条件

ヘッダー: atlwin.h

COMMAND_HANDLER

メッセージ マップ内のエントリを定義します。

COMMAND_HANDLER(id, code, func)

パラメーター

id
[入力] メニュー項目、コントロール、またはアクセラレータの識別子。

code
[入力] 通知コード。

func
[入力] メッセージ ハンドラー関数の名前。

解説

COMMAND_HANDLER では、通知コードとコントロール識別子に基づいて、WM_COMMAND メッセージを特定のハンドラー関数にマップします。 次に例を示します。

class ATL_NO_VTABLE CPolyProp :
   public CComObjectRootEx<CComSingleThreadModel>,
   public CComCoClass<CPolyProp, &CLSID_PolyProp>,
   public IPropertyPageImpl<CPolyProp>,
   public CDialogImpl<CPolyProp>
{
public:
BEGIN_COM_MAP(CPolyProp)
   COM_INTERFACE_ENTRY(IPropertyPage)
END_COM_MAP()

BEGIN_MSG_MAP(CPolyProp)
   COMMAND_HANDLER(IDC_SIDES, EN_CHANGE, OnEnChangeSides)
   CHAIN_MSG_MAP(IPropertyPageImpl<CPolyProp>)
END_MSG_MAP()

   // When a CPolyProp object receives a WM_COMMAND message identified 
   // by IDC_SIDES and EN_CHANGE, the message is directed to 
   // CPolyProp::OnEnChangeSides for the actual processing.
   LRESULT OnEnChangeSides(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, 
      BOOL& /*bHandled*/);

COMMAND_HANDLER マクロで指定される関数はすべて、次のように定義する必要があります。

LRESULT CommandHandler(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);

メッセージ マップでは、CommandHandler が呼び出される前に bHandled が TRUE に設定されます。 CommandHandler によってメッセージが完全に処理されない場合は、bHandled を FALSE に設定して、メッセージをさらに処理する必要があることを示す必要があります。

Note

メッセージ マップは、常に BEGIN_MSG_MAP から開始します。 その後、ALT_MSG_MAP を使用して、後続の代替メッセージ マップを宣言できます。 END_MSG_MAP マクロでは、メッセージ マップの末尾をマークします。 すべてのメッセージ マップには、BEGIN_MSG_MAP と END_MSG_MAP のインスタンスを 1 つだけ指定する必要があります。

COMMAND_HANDLER に加えて、MESSAGE_HANDLER を使用して、識別子やコードに関係なく WM_COMMAND メッセージをマップすることもできます。 この場合、MESSAGE_HANDLER(WM_COMMAND, OnHandlerFunction) によってすべての WM_COMMAND メッセージが OnHandlerFunction に送信されます。

ATL でメッセージ マップを使用する方法の詳細については、「メッセージ マップ」を参照してください。

必要条件

ヘッダー: atlwin.h

COMMAND_ID_HANDLER

COMMAND_HANDLER に似ていますが、メニュー項目、コントロール、またはアクセラレータの識別子にのみ基づいて WM_COMMAND メッセージをマップします。

COMMAND_ID_HANDLER(id, func)

パラメーター

id
[入力] メッセージを送信するメニュー項目、コントロール、またはアクセラレータの識別子。

func
[入力] メッセージ ハンドラー関数の名前。

必要条件

ヘッダー: atlwin.h

COMMAND_RANGE_CODE_HANDLER

COMMAND_RANGE_HANDLER に似ていますが、特定の通知コードを持つ WM_COMMAND メッセージを、一連のコントロールから 1 つのハンドラー関数にマップします。

COMMAND_RANGE_CODE_HANDLER(idFirst, idLast, code, func)

パラメーター

idFirst
[入力] 連続する範囲のコントロール識別子の先頭をマークします。

idLast
[入力] 連続する範囲のコントロール識別子の末尾をマークします。

code
[入力] 通知コード。

func
[入力] メッセージ ハンドラー関数の名前。

解説

この範囲は、メッセージを送信するメニュー項目、コントロール、またはアクセラレータの識別子に基づいています。

必要条件

ヘッダー: atlwin.h

COMMAND_RANGE_HANDLER

COMMAND_HANDLER に似ていますが、WM_COMMAND メッセージを一連のコントロールから 1 つのハンドラー関数にマップします。

COMMAND_RANGE_HANDLER( idFirst, idLast, func)

パラメーター

idFirst
[入力] 連続する範囲のコントロール識別子の先頭をマークします。

idLast
[入力] 連続する範囲のコントロール識別子の末尾をマークします。

func
[入力] メッセージ ハンドラー関数の名前。

解説

この範囲は、メッセージを送信するメニュー項目、コントロール、またはアクセラレータの識別子に基づいています。

必要条件

ヘッダー: atlwin.h

DECLARE_EMPTY_MSG_MAP

空のメッセージ マップを宣言します。

DECLARE_EMPTY_MSG_MAP()

解説

DECLARE_EMPTY_MSG_MAP は、BEGIN_MSG_MAP マクロと END_MSG_MAP マクロを呼び出して空のメッセージ マップを作成する便利なマクロです。

BEGIN_MSG_MAP(CExample)
END_MSG_MAP()

DEFAULT_REFLECTION_HANDLER

反映されたメッセージを受信する子ウィンドウ (コントロール) の既定のハンドラーを指定します。このハンドラーにより、処理されていないメッセージが適切に DefWindowProc に渡されます。

DEFAULT_REFLECTION_HANDLER()

必要条件

ヘッダー: atlwin.h

END_MSG_MAP

メッセージ マップの末尾をマークします。

END_MSG_MAP()

解説

メッセージ マップの先頭をマークするには、常に BEGIN_MSG_MAP マクロを使用します。 後続の代替メッセージ マップを宣言するには、ALT_MSG_MAP を使用します。

BEGIN_MSG_MAP と END_MSG_MAP のインスタンスは常に 1 つだけです。

ATL でメッセージ マップを使用する方法の詳細については、「メッセージ マップ」を参照してください。

次の例は、既定のメッセージ マップと 1 つの代替メッセージ マップを示しています。それぞれに 1 つのハンドラー関数が含まれています。

BEGIN_MSG_MAP(CMyOneAltClass)
   MESSAGE_HANDLER(WM_PAINT, OnPaint)
ALT_MSG_MAP(1)
   MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)
END_MSG_MAP()

次の例は、2 つの代替メッセージ マップを示しています。 既定のメッセージ マップは空です。

BEGIN_MSG_MAP(CMyClass)
ALT_MSG_MAP(1)
   MESSAGE_HANDLER(WM_PAINT, OnPaint)
   MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)
ALT_MSG_MAP(2)
   MESSAGE_HANDLER(WM_CREATE, OnCreate)
END_MSG_MAP()

必要条件

ヘッダー: atlwin.h

FORWARD_NOTIFICATIONS

通知メッセージを親ウィンドウに転送します。

FORWARD_NOTIFICATIONS()

解説

このマクロをメッセージ マップの一部として指定します。

必要条件

ヘッダー: atlwin.h

MESSAGE_HANDLER

メッセージ マップ内のエントリを定義します。

MESSAGE_HANDLER( msg, func )

パラメーター

msg
[入力] Windows メッセージ。

func
[入力] メッセージ ハンドラー関数の名前。

解説

MESSAGE_HANDLER では、Windows メッセージを指定のハンドラー関数にマップします。

MESSAGE_HANDLER マクロで指定される関数はすべて、次のように定義する必要があります。

LRESULT MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);

メッセージ マップでは、MessageHandler が呼び出される前に bHandled が TRUE に設定されます。 MessageHandler によってメッセージが完全に処理されない場合は、bHandled を FALSE に設定して、メッセージをさらに処理する必要があることを示す必要があります。

Note

メッセージ マップは、常に BEGIN_MSG_MAP から開始します。 その後、ALT_MSG_MAP を使用して、後続の代替メッセージ マップを宣言できます。 END_MSG_MAP マクロでは、メッセージ マップの末尾をマークします。 すべてのメッセージ マップには、BEGIN_MSG_MAP と END_MSG_MAP のインスタンスを 1 つだけ指定する必要があります。

MESSAGE_HANDLER に加えて、COMMAND_HANDLERNOTIFY_HANDLER を使用して、WM_COMMAND メッセージと WM_NOTIFY メッセージをそれぞれマップできます。

ATL でメッセージ マップを使用する方法の詳細については、「メッセージ マップ」を参照してください。

class CMyBaseWindow : public CWindowImpl<CMyBaseWindow>
{
public:
   BEGIN_MSG_MAP(CMyBaseWindow)
      MESSAGE_HANDLER(WM_CREATE, OnCreate)
   END_MSG_MAP()

   // When a CMyBaseWindow object receives a WM_CREATE message, the message
   // is directed to CMyBaseWindow::OnCreate for the actual processing.
   LRESULT OnCreate(UINT /*nMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, 
      BOOL& /*bHandled*/)
   {
      return 0;   
   }
};

必要条件

ヘッダー: atlwin.h

MESSAGE_RANGE_HANDLER

MESSAGE_HANDLER に似ていますが、一連の Windows メッセージを 1 つのハンドラー関数にマップします。

MESSAGE_RANGE_HANDLER( msgFirst, msgLast, func )

パラメーター

msgFirst
[入力] 連続するメッセージの範囲の先頭をマークします。

msgLast
[入力] 連続する範囲のメッセージの末尾をマークします。

func
[入力] メッセージ ハンドラー関数の名前。

必要条件

ヘッダー: atlwin.h

NOTIFY_CODE_HANDLER

NOTIFY_HANDLER に似ていますが、通知コードにのみ基づいて WM_NOTIFY メッセージをマップします。

NOTIFY_CODE_HANDLER(cd, func)

パラメーター

cd
[入力] 通知コード。

func
[入力] メッセージ ハンドラー関数の名前。

必要条件

ヘッダー: atlwin.h

NOTIFY_HANDLER

メッセージ マップ内のエントリを定義します。

NOTIFY_HANDLER( id, cd, func )

パラメーター

id
[入力] メッセージを送信するコントロールの識別子。

cd
[入力] 通知コード。

func
[入力] メッセージ ハンドラー関数の名前。

解説

NOTIFY_HANDLER では、通知コードとコントロール識別子に基づいて、WM_NOTIFY メッセージを指定のハンドラー関数にマップします。

NOTIFY_HANDLER マクロで指定される関数はすべて、次のように定義する必要があります。

LRESULT NotifyHandler(int idCtrl, LPNMHDR pnmh, BOOL& bHandled);

メッセージ マップでは、NotifyHandler が呼び出される前に bHandled が TRUE に設定されます。 NotifyHandler によってメッセージが完全に処理されない場合は、bHandled を FALSE に設定して、メッセージをさらに処理する必要があることを示す必要があります。

Note

メッセージ マップは、常に BEGIN_MSG_MAP から開始します。 その後、ALT_MSG_MAP を使用して、後続の代替メッセージ マップを宣言できます。 END_MSG_MAP マクロでは、メッセージ マップの末尾をマークします。 すべてのメッセージ マップには、BEGIN_MSG_MAP と END_MSG_MAP のインスタンスを 1 つだけ指定する必要があります。

NOTIFY_HANDLER に加えて、MESSAGE_HANDLER を使用して、識別子やコードに関係なく WM_NOTIFY メッセージをマップすることもできます。 この場合、MESSAGE_HANDLER(WM_NOTIFY, OnHandlerFunction) によってすべての WM_NOTIFY メッセージが OnHandlerFunction に送信されます。

ATL でメッセージ マップを使用する方法の詳細については、「メッセージ マップ」を参照してください。

class CMyDialog2 : public CDialogImpl<CMyDialog2>
{
public:
   enum { IDD = IDD_MYDLG };

   BEGIN_MSG_MAP(CMyDialog2)
      NOTIFY_HANDLER(IDC_TREE1, NM_CLICK, OnNMClickTree1)
   END_MSG_MAP()

public:
   // When a CMyDialog2 object receives a WM_NOTIFY message 
   // identified by IDC_TREE1 and NM_CLICK, the message is 
   // directed to CMyDialog2::OnNMClickTree1 for the actual
   // processing.
   LRESULT OnNMClickTree1(int /*idCtrl*/, LPNMHDR pNMHDR, BOOL& /*bHandled*/);
};

必要条件

ヘッダー: atlwin.h

NOTIFY_ID_HANDLER

NOTIFY_HANDLER に似ていますが、コントロール識別子にのみ基づいて WM_NOTIFY メッセージをマップします。

NOTIFY_ID_HANDLER( id, func )

パラメーター

id
[入力] メッセージを送信するコントロールの識別子。

func
[入力] メッセージ ハンドラー関数の名前。

必要条件

ヘッダー: atlwin.h

NOTIFY_RANGE_CODE_HANDLER

NOTIFY_RANGE_HANDLER に似ていますが、特定の通知コードを持つ WM_NOTIFY メッセージを、一連のコントロールから 1 つのハンドラー関数にマップします。

NOTIFY_RANGE_CODE_HANDLER( idFirst, idLast, cd, func )

パラメーター

idFirst
[入力] 連続する範囲のコントロール識別子の先頭をマークします。

idLast
[入力] 連続する範囲のコントロール識別子の末尾をマークします。

cd
[入力] 通知コード。

func
[入力] メッセージ ハンドラー関数の名前。

解説

この範囲は、メッセージを送信するコントロールの識別子に基づいています。

必要条件

ヘッダー: atlwin.h

NOTIFY_RANGE_HANDLER

NOTIFY_HANDLER に似ていますが、WM_NOTIFY メッセージを一連のコントロールから 1 つのハンドラー関数にマップします。

NOTIFY_RANGE_HANDLER( idFirst, idLast, func )

パラメーター

idFirst
[入力] 連続する範囲のコントロール識別子の先頭をマークします。

idLast
[入力] 連続する範囲のコントロール識別子の末尾をマークします。

func
[入力] メッセージ ハンドラー関数の名前。

解説

この範囲は、メッセージを送信するコントロールの識別子に基づいています。

必要条件

ヘッダー: atlwin.h

REFLECT_NOTIFICATIONS

通知メッセージを送信した子ウィンドウ (コントロール) にこれらのメッセージを反映します。

REFLECT_NOTIFICATIONS()

解説

このマクロを親ウィンドウのメッセージ マップの一部として指定します。

必要条件

ヘッダー: atlwin.h

REFLECTED_COMMAND_CODE_HANDLER

COMMAND_CODE_HANDLER に似ていますが、親ウィンドウから反映されたコマンドをマップします。

REFLECTED_COMMAND_CODE_HANDLER( code, func )

パラメーター

code
[入力] 通知コード。

func
[入力] メッセージ ハンドラー関数の名前。

必要条件

ヘッダー: atlwin.h

REFLECTED_COMMAND_HANDLER

COMMAND_HANDLER に似ていますが、親ウィンドウから反映されたコマンドをマップします。

REFLECTED_COMMAND_HANDLER( id, code, func )

パラメーター

id
[入力] メニュー項目、コントロール、またはアクセラレータの識別子。

code
[入力] 通知コード。

func
[入力] メッセージ ハンドラー関数の名前。

必要条件

ヘッダー: atlwin.h

REFLECTED_COMMAND_ID_HANDLER

COMMAND_ID_HANDLER に似ていますが、親ウィンドウから反映されたコマンドをマップします。

REFLECTED_COMMAND_ID_HANDLER( id, func )

パラメーター

id
[入力] メニュー項目、コントロール、またはアクセラレータの識別子。

func
[入力] メッセージ ハンドラー関数の名前。

必要条件

ヘッダー: atlwin.h

REFLECTED_COMMAND_RANGE_CODE_HANDLER

COMMAND_RANGE_CODE_HANDLER に似ていますが、親ウィンドウから反映されたコマンドをマップします。

REFLECTED_COMMAND_RANGE_CODE_HANDLER( idFirst, idLast, code, func )

パラメーター

idFirst
[入力] 連続する範囲のコントロール識別子の先頭をマークします。

idLast
[入力] 連続する範囲のコントロール識別子の末尾をマークします。

code
[入力] 通知コード。

func
[入力] メッセージ ハンドラー関数の名前。

必要条件

ヘッダー: atlwin.h

REFLECTED_COMMAND_RANGE_HANDLER

COMMAND_RANGE_HANDLER に似ていますが、親ウィンドウから反映されたコマンドをマップします。

REFLECTED_COMMAND_RANGE_HANDLER( idFirst, idLast, func )

パラメーター

idFirst
[入力] 連続する範囲のコントロール識別子の先頭をマークします。

idLast
[入力] 連続する範囲のコントロール識別子の末尾をマークします。

func
[入力] メッセージ ハンドラー関数の名前。

必要条件

ヘッダー: atlwin.h

REFLECTED_NOTIFY_CODE_HANDLER

NOTIFY_CODE_HANDLER に似ていますが、親ウィンドウから反映された通知をマップします。

REFLECTED_NOTIFY_CODE_HANDLER_EX( cd, func )

パラメーター

cd
[入力] 通知コード。

func
[入力] メッセージ ハンドラー関数の名前。

必要条件

ヘッダー: atlwin.h

REFLECTED_NOTIFY_HANDLER

NOTIFY_HANDLER に似ていますが、親ウィンドウから反映された通知をマップします。

REFLECTED_NOTIFY_HANDLER( id, cd, func )

パラメーター

id
[入力] メニュー項目、コントロール、またはアクセラレータの識別子。

cd
[入力] 通知コード。

func
[入力] メッセージ ハンドラー関数の名前。

必要条件

ヘッダー: atlwin.h

REFLECTED_NOTIFY_ID_HANDLER

NOTIFY_ID_HANDLER に似ていますが、親ウィンドウから反映された通知をマップします。

REFLECTED_NOTIFY_ID_HANDLER( id, func )

パラメーター

id
[入力] メニュー項目、コントロール、またはアクセラレータの識別子。

func
[入力] メッセージ ハンドラー関数の名前。

必要条件

ヘッダー: atlwin.h

REFLECTED_NOTIFY_RANGE_CODE_HANDLER

NOTIFY_RANGE_CODE_HANDLER に似ていますが、親ウィンドウから反映された通知をマップします。

REFLECTED_NOTIFY_RANGE_CODE_HANDLER( idFirst, idLast, cd, func )

パラメーター

idFirst
[入力] 連続する範囲のコントロール識別子の先頭をマークします。

idLast
[入力] 連続する範囲のコントロール識別子の末尾をマークします。

cd
[入力] 通知コード。

func
[入力] メッセージ ハンドラー関数の名前。

必要条件

ヘッダー: atlwin.h

REFLECTED_NOTIFY_RANGE_HANDLER

NOTIFY_RANGE_HANDLER に似ていますが、親ウィンドウから反映された通知をマップします。

REFLECTED_NOTIFY_RANGE_HANDLER( idFirst, idLast, func )

パラメーター

idFirst
[入力] 連続する範囲のコントロール識別子の先頭をマークします。

idLast
[入力] 連続する範囲のコントロール識別子の末尾をマークします。

func
[入力] メッセージ ハンドラー関数の名前。

関連項目

マクロ