訊息對應巨集 (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
[in]訊息對應標識碼。
備註
ATL 會依數字識別每個訊息對應。 默認訊息對應 (以 BEGIN_MSG_MAP 巨集 宣告) 會以 0 來識別。 msgMapID 會識別替代訊息對應。
訊息對應可用來處理傳送至視窗的訊息。 例如, CContainedWindow 可讓您在包含的物件中指定訊息對應的識別碼。 CContainedWindow::WindowProc 接著會使用此訊息對應,將自主視窗的訊息導向適當的處理程式函式或另一個訊息對應。 如需宣告處理程式函式的宏清單,請參閱 BEGIN_MSG_MAP。
一律使用BEGIN_MSG_MAP開始訊息對應。 然後,您可以宣告後續的替代訊息對應。
END_MSG_MAP巨集標示訊息對應的結尾。 請注意,一律只有一個實例BEGIN_MSG_MAP和END_MSG_MAP。
如需在 ATL 中使用訊息對應的詳細資訊,請參閱 訊息對應。
範例
下列範例顯示預設訊息對應和一個替代訊息對應,每一個都包含一個處理程式函式:
BEGIN_MSG_MAP(CMyOneAltClass)
MESSAGE_HANDLER(WM_PAINT, OnPaint)
ALT_MSG_MAP(1)
MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)
END_MSG_MAP()
下一個範例顯示兩個替代訊息對應。 默認訊息對應是空的。
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
[in]包含訊息對應之類別的名稱。
備註
CWindowImpl::WindowProc 會使用預設訊息對應來處理傳送至視窗的訊息。 訊息對應會將訊息導向適當的處理程式函式或另一個訊息對應。
下列宏會將訊息對應至處理程式函式。 此函式必須在Class 中定義。
Macro | 描述 |
---|---|
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訊息範圍對應至處理程式函式。 |
下列宏會將訊息導向至另一個訊息對應。 此程式稱為「鏈結」。
Macro | 描述 |
---|---|
CHAIN_MSG_MAP | 鏈結至基類中的預設訊息對應。 |
CHAIN_MSG_MAP_MEMBER | 鏈結至 類別數據成員中的預設訊息對應。 |
CHAIN_MSG_MAP_ALT | 鏈結至基類中的替代訊息對應。 |
CHAIN_MSG_MAP_ALT_MEMBER | 鏈結至 類別數據成員中的替代訊息對應。 |
CHAIN_MSG_MAP_DYNAMIC | 鏈結至運行時間另一個類別中的預設訊息對應。 |
下列宏會從父窗口導向「反映」訊息。 例如,控件通常會將通知訊息傳送至其父視窗進行處理,但父視窗可以將訊息反映回控件。
Macro | 描述 |
---|---|
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開始訊息對應。 然後,您可以宣告後續的替代訊息對應。 下列範例顯示預設訊息對應和一個替代訊息對應,每一個都包含一個處理程式函式:
BEGIN_MSG_MAP(CMyOneAltClass)
MESSAGE_HANDLER(WM_PAINT, OnPaint)
ALT_MSG_MAP(1)
MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)
END_MSG_MAP()
下一個範例顯示兩個替代訊息對應。 默認訊息對應是空的。
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。
如需在 ATL 中使用訊息對應的詳細資訊,請參閱 訊息對應。
需求
標頭: atlwin.h
CHAIN_MSG_MAP_ALT
定義訊息對應中的專案。
CHAIN_MSG_MAP_ALT(theChainClass, msgMapID)
參數
theChainClass
[in]包含訊息對應之基類的名稱。
msgMapID
[in]訊息對應標識碼。
備註
CHAIN_MSG_MAP_ALT將訊息導向基類中的替代訊息對應。 您必須已使用 ALT_MSG_MAP(msgMapID) 宣告此替代訊息對應。 若要將訊息導向基類的預設訊息對應(以 BEGIN_MSG_MAP 宣告),請使用 CHAIN_MSG_MAP。 如需範例,請參閱 CHAIN_MSG_MAP。
注意
一律使用BEGIN_MSG_MAP開始訊息對應。 接著,您可以使用 ALT_MSG_MAP來宣告後續的替代訊息對應。 END_MSG_MAP巨集標示訊息對應的結尾。 每個訊息對應都必須只有一個實例BEGIN_MSG_MAP和END_MSG_MAP。
如需在 ATL 中使用訊息對應的詳細資訊,請參閱 訊息對應。
需求
標頭: atlwin.h
CHAIN_MSG_MAP_ALT_MEMBER
定義訊息對應中的專案。
CHAIN_MSG_MAP_ALT_MEMBER(theChainMember, msgMapID)
參數
theChainMember
[in]包含訊息對應的數據成員名稱。
msgMapID
[in]訊息對應標識碼。
備註
CHAIN_MSG_MAP_ALT_MEMBER會將訊息導向至數據成員中的替代訊息對應。 您必須已使用 ALT_MSG_MAP(msgMapID) 宣告此替代訊息對應。 若要將訊息導向至數據成員的預設訊息對應(以 BEGIN_MSG_MAP 宣告),請使用 CHAIN_MSG_MAP_MEMBER。 如需範例,請參閱 CHAIN_MSG_MAP_MEMBER。
注意
一律使用BEGIN_MSG_MAP開始訊息對應。 接著,您可以使用 ALT_MSG_MAP來宣告後續的替代訊息對應。 END_MSG_MAP巨集標示訊息對應的結尾。 每個訊息對應都必須只有一個實例BEGIN_MSG_MAP和END_MSG_MAP。
如需在 ATL 中使用訊息對應的詳細資訊,請參閱 訊息對應。
需求
標頭: atlwin.h
CHAIN_MSG_MAP
定義訊息對應中的專案。
CHAIN_MSG_MAP(theChainClass)
參數
theChainClass
[in]包含訊息對應之基類的名稱。
備註
CHAIN_MSG_MAP將訊息導向基類的預設訊息對應(以 BEGIN_MSG_MAP 宣告)。 若要將訊息導向基類的替代訊息對應(以 ALT_MSG_MAP 宣告),請使用 CHAIN_MSG_MAP_ALT。
注意
一律使用BEGIN_MSG_MAP開始訊息對應。 接著,您可以使用 ALT_MSG_MAP來宣告後續的替代訊息對應。 END_MSG_MAP巨集標示訊息對應的結尾。 每個訊息對應都必須只有一個實例BEGIN_MSG_MAP和END_MSG_MAP。
如需在 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
的第二個替代訊息對應,而且OnChar
未處理訊息,訊息就會導向至 中指定的替代訊息對應。CMyBaseClass
CMyBaseClass
必須已使用 ALT_MSG_MAP(1) 宣告此訊息對應。
需求
標頭: atlwin.h
CHAIN_MSG_MAP_DYNAMIC
定義訊息對應中的專案。
CHAIN_MSG_MAP_DYNAMIC(dynaChainID)
參數
dynaChainID
[in]物件訊息對應的唯一標識符。
備註
CHAIN_MSG_MAP_DYNAMIC在運行時間將訊息導向至另一個 物件中的預設訊息對應。 物件及其訊息對應會與您透過 CDynamicChain::SetChainEntry 定義的 dynaChainID 相關聯。 您必須從 CDynamicChain
衍生類別,才能使用 CHAIN_MSG_MAP_DYNAMIC。 如需範例,請參閱 CDynamicChain 概觀。
注意
一律使用 BEGIN_MSG_MAP開始訊息對應。 接著,您可以使用 ALT_MSG_MAP來宣告後續的替代訊息對應。 END_MSG_MAP巨集標示訊息對應的結尾。 每個訊息對應都必須只有一個實例BEGIN_MSG_MAP和END_MSG_MAP。
如需在 ATL 中使用訊息對應的詳細資訊,請參閱 訊息對應。
需求
標頭: atlwin.h
CHAIN_MSG_MAP_MEMBER
定義訊息對應中的專案。
CHAIN_MSG_MAP_MEMBER(theChainMember)
參數
theChainMember
[in]包含訊息對應的數據成員名稱。
備註
CHAIN_MSG_MAP_MEMBER會將訊息導向至數據成員的預設訊息對應(以 BEGIN_MSG_MAP 宣告)。 若要將訊息導向至數據成員的替代訊息對應(以 ALT_MSG_MAP 宣告),請使用 CHAIN_MSG_MAP_ALT_MEMBER。
注意
一律使用BEGIN_MSG_MAP開始訊息對應。 接著,您可以使用 ALT_MSG_MAP來宣告後續的替代訊息對應。 END_MSG_MAP巨集標示訊息對應的結尾。 每個訊息對應都必須只有一個實例BEGIN_MSG_MAP和END_MSG_MAP。
如需在 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
的第二個替代訊息對應,且OnChar
未處理訊息,則會將訊息導向至 指定的替代訊息對應m_obj
。 類別CMyContainedClass
必須已使用 ALT_MSG_MAP(1) 宣告此訊息對應。
需求
標頭: atlwin.h
COMMAND_CODE_HANDLER
類似於 COMMAND_HANDLER,但只會根據通知碼對應 WM_COMMAND 訊息。
COMMAND_CODE_HANDLER(code, func)
參數
code
[in]通知碼。
func
[in]訊息處理程式函式的名稱。
需求
標頭: atlwin.h
COMMAND_HANDLER
定義訊息對應中的專案。
COMMAND_HANDLER(id, code, func)
參數
id
[in]功能表項、控件或快捷鍵的標識碼。
code
[in]通知碼。
func
[in]訊息處理程式函式的名稱。
備註
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,表示訊息需要進一步處理。
注意
一律使用 BEGIN_MSG_MAP開始訊息對應。 接著,您可以使用 ALT_MSG_MAP 來宣告後續的替代訊息對應。 END_MSG_MAP巨集標示訊息對應的結尾。 每個訊息對應都必須只有一個實例BEGIN_MSG_MAP和END_MSG_MAP。
除了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
[in]傳送訊息之功能表項、控制件或快捷鍵的識別碼。
func
[in]訊息處理程式函式的名稱。
需求
標頭: atlwin.h
COMMAND_RANGE_CODE_HANDLER
類似於COMMAND_RANGE_HANDLER,但會將WM_COMMAND訊息與特定通知程式代碼從一系列控件對應到單一處理程式函式。
COMMAND_RANGE_CODE_HANDLER(idFirst, idLast, code, func)
參數
idFirst
[in]標記連續控制標識碼範圍的開頭。
idLast
[in]標記連續控制標識碼範圍的結尾。
code
[in]通知碼。
func
[in]訊息處理程式函式的名稱。
備註
此範圍是以傳送訊息之功能表項、控制項或快捷鍵的標識碼為基礎。
需求
標頭: atlwin.h
COMMAND_RANGE_HANDLER
類似於COMMAND_HANDLER,但會將WM_COMMAND訊息從一系列控件對應至單一處理程式函式。
COMMAND_RANGE_HANDLER( idFirst, idLast, func)
參數
idFirst
[in]標記連續控制標識碼範圍的開頭。
idLast
[in]標記連續控制標識碼範圍的結尾。
func
[in]訊息處理程式函式的名稱。
備註
此範圍是以傳送訊息之功能表項、控制項或快捷鍵的標識碼為基礎。
需求
標頭: 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
提供將接收反映訊息之子視窗 (control) 的預設處理程式;處理程式會將未處理的訊息正確傳遞至 DefWindowProc
。
DEFAULT_REFLECTION_HANDLER()
需求
標頭: atlwin.h
END_MSG_MAP
標記訊息對應的結尾。
END_MSG_MAP()
備註
一律使用 BEGIN_MSG_MAP 巨集標記訊息對應的開頭。 使用 ALT_MSG_MAP 來宣告後續的替代訊息對應。
請注意,一律只有一個實例BEGIN_MSG_MAP和END_MSG_MAP。
如需在 ATL 中使用訊息對應的詳細資訊,請參閱 訊息對應。
範例
下列範例顯示預設訊息對應和一個替代訊息對應,每一個都包含一個處理程式函式:
BEGIN_MSG_MAP(CMyOneAltClass)
MESSAGE_HANDLER(WM_PAINT, OnPaint)
ALT_MSG_MAP(1)
MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)
END_MSG_MAP()
下一個範例顯示兩個替代訊息對應。 默認訊息對應是空的。
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
[in]Windows 訊息。
func
[in]訊息處理程式函式的名稱。
備註
MESSAGE_HANDLER將 Windows 訊息對應至指定的處理程式函式。
MESSAGE_HANDLER 巨集中指定的任何函式都必須定義如下:
LRESULT MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
在呼叫 之前MessageHandler
,訊息對應會設定bHandled
為 TRUE。 如果未 MessageHandler
完全處理訊息,它應該設定 bHandled
為 FALSE,表示訊息需要進一步處理。
注意
一律使用 BEGIN_MSG_MAP開始訊息對應。 接著,您可以使用 ALT_MSG_MAP 來宣告後續的替代訊息對應。 END_MSG_MAP巨集標示訊息對應的結尾。 每個訊息對應都必須只有一個實例BEGIN_MSG_MAP和END_MSG_MAP。
除了MESSAGE_HANDLER之外,您還可以分別使用 COMMAND_HANDLER 和 NOTIFY_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 訊息對應至單一處理程式函式。
MESSAGE_RANGE_HANDLER( msgFirst, msgLast, func )
參數
msgFirst
[in]標記連續訊息範圍的開頭。
msgLast
[in]標記連續訊息範圍的結尾。
func
[in]訊息處理程式函式的名稱。
需求
標頭: atlwin.h
NOTIFY_CODE_HANDLER
類似於 NOTIFY_HANDLER,但只會根據通知碼對應 WM_NOTIFY 訊息。
NOTIFY_CODE_HANDLER(cd, func)
參數
cd
[in]通知碼。
func
[in]訊息處理程式函式的名稱。
需求
標頭: atlwin.h
NOTIFY_HANDLER
定義訊息對應中的專案。
NOTIFY_HANDLER( id, cd, func )
參數
id
[in]傳送訊息之控件的標識碼。
cd
[in]通知碼。
func
[in]訊息處理程式函式的名稱。
備註
NOTIFY_HANDLER會根據通知碼和控件識別碼,將WM_NOTIFY訊息對應至指定的處理程式函式。
NOTIFY_HANDLER 巨集中指定的任何函式都必須定義如下:
LRESULT NotifyHandler(int idCtrl, LPNMHDR pnmh, BOOL& bHandled);
在呼叫 之前NotifyHandler
,訊息對應會設定bHandled
為 TRUE。 如果未 NotifyHandler
完全處理訊息,它應該設定 bHandled
為 FALSE,表示訊息需要進一步處理。
注意
一律使用 BEGIN_MSG_MAP開始訊息對應。 接著,您可以使用 ALT_MSG_MAP 來宣告後續的替代訊息對應。 END_MSG_MAP巨集標示訊息對應的結尾。 每個訊息對應都必須只有一個實例BEGIN_MSG_MAP和END_MSG_MAP。
除了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
[in]傳送訊息之控件的標識碼。
func
[in]訊息處理程式函式的名稱。
需求
標頭: atlwin.h
NOTIFY_RANGE_CODE_HANDLER
類似於NOTIFY_RANGE_HANDLER,但會將WM_NOTIFY訊息與特定通知碼從一系列控件對應到單一處理程式函式。
NOTIFY_RANGE_CODE_HANDLER( idFirst, idLast, cd, func )
參數
idFirst
[in]標記連續控制標識碼範圍的開頭。
idLast
[in]標記連續控制標識碼範圍的結尾。
cd
[in]通知碼。
func
[in]訊息處理程式函式的名稱。
備註
此範圍是以傳送訊息之控件的標識碼為基礎。
需求
標頭: atlwin.h
NOTIFY_RANGE_HANDLER
類似於NOTIFY_HANDLER,但會將WM_NOTIFY來自一系列控件的訊息對應至單一處理程式函式。
NOTIFY_RANGE_HANDLER( idFirst, idLast, func )
參數
idFirst
[in]標記連續控制標識碼範圍的開頭。
idLast
[in]標記連續控制標識碼範圍的結尾。
func
[in]訊息處理程式函式的名稱。
備註
此範圍是以傳送訊息之控件的標識碼為基礎。
需求
標頭: atlwin.h
REFLECT_NOTIFICATIONS
將通知訊息反映回傳送它們的子視窗(控制件)。
REFLECT_NOTIFICATIONS()
備註
將此巨集指定為父視窗訊息對應的一部分。
需求
標頭: atlwin.h
REFLECTED_COMMAND_CODE_HANDLER
類似於 COMMAND_CODE_HANDLER,但會對應從父視窗反映的命令。
REFLECTED_COMMAND_CODE_HANDLER( code, func )
參數
code
[in]通知碼。
func
[in]訊息處理程式函式的名稱。
需求
標頭: atlwin.h
REFLECTED_COMMAND_HANDLER
類似於 COMMAND_HANDLER,但對應從父視窗反映的命令。
REFLECTED_COMMAND_HANDLER( id, code, func )
參數
id
[in]功能表項、控件或快捷鍵的標識碼。
code
[in]通知碼。
func
[in]訊息處理程式函式的名稱。
需求
標頭: atlwin.h
REFLECTED_COMMAND_ID_HANDLER
類似於 COMMAND_ID_HANDLER,但會對應從父視窗反映的命令。
REFLECTED_COMMAND_ID_HANDLER( id, func )
參數
id
[in]功能表項、控件或快捷鍵的標識碼。
func
[in]訊息處理程式函式的名稱。
需求
標頭: atlwin.h
REFLECTED_COMMAND_RANGE_CODE_HANDLER
類似於 COMMAND_RANGE_CODE_HANDLER,但對應從父視窗反映的命令。
REFLECTED_COMMAND_RANGE_CODE_HANDLER( idFirst, idLast, code, func )
參數
idFirst
[in]標記連續控制標識碼範圍的開頭。
idLast
[in]標記連續控制標識碼範圍的結尾。
code
[in]通知碼。
func
[in]訊息處理程式函式的名稱。
需求
標頭: atlwin.h
REFLECTED_COMMAND_RANGE_HANDLER
類似於 COMMAND_RANGE_HANDLER,但對應從父視窗反映的命令。
REFLECTED_COMMAND_RANGE_HANDLER( idFirst, idLast, func )
參數
idFirst
[in]標記連續控制標識碼範圍的開頭。
idLast
[in]標記連續控制標識碼範圍的結尾。
func
[in]訊息處理程式函式的名稱。
需求
標頭: atlwin.h
REFLECTED_NOTIFY_CODE_HANDLER
類似於 NOTIFY_CODE_HANDLER,但對應從父視窗反映的通知。
REFLECTED_NOTIFY_CODE_HANDLER_EX( cd, func )
參數
cd
[in]通知碼。
func
[in]訊息處理程式函式的名稱。
需求
標頭: atlwin.h
REFLECTED_NOTIFY_HANDLER
類似於 NOTIFY_HANDLER,但會對應從父視窗反映的通知。
REFLECTED_NOTIFY_HANDLER( id, cd, func )
參數
id
[in]功能表項、控件或快捷鍵的標識碼。
cd
[in]通知碼。
func
[in]訊息處理程式函式的名稱。
需求
標頭: atlwin.h
REFLECTED_NOTIFY_ID_HANDLER
類似於 NOTIFY_ID_HANDLER,但對應從父視窗反映的通知。
REFLECTED_NOTIFY_ID_HANDLER( id, func )
參數
id
[in]功能表項、控件或快捷鍵的標識碼。
func
[in]訊息處理程式函式的名稱。
需求
標頭: atlwin.h
REFLECTED_NOTIFY_RANGE_CODE_HANDLER
類似於 NOTIFY_RANGE_CODE_HANDLER,但對應從父視窗反映的通知。
REFLECTED_NOTIFY_RANGE_CODE_HANDLER( idFirst, idLast, cd, func )
參數
idFirst
[in]標記連續控制標識碼範圍的開頭。
idLast
[in]標記連續控制標識碼範圍的結尾。
cd
[in]通知碼。
func
[in]訊息處理程式函式的名稱。
需求
標頭: atlwin.h
REFLECTED_NOTIFY_RANGE_HANDLER
類似於 NOTIFY_RANGE_HANDLER,但對應從父視窗反映的通知。
REFLECTED_NOTIFY_RANGE_HANDLER( idFirst, idLast, func )
參數
idFirst
[in]標記連續控制標識碼範圍的開頭。
idLast
[in]標記連續控制標識碼範圍的結尾。
func
[in]訊息處理程式函式的名稱。