Àüȸ ¼³¸íÇÑ Ã¼Àο¡ ÀÇÇØ base classÀÇ ¸Þ¼¼Áö ¸ÊÀº º¹¼öÀÇ »ó¼Ó Ŭ·¡½º·ÎºÎÅÍÀÇ ¸Þ¼¼Áö¸¦ ó¸®ÇÒ ¼ö ÀÖ°Ô µË´Ï´Ù. ÀÌÇÏ¿¡ ³ªÅ¸³»´Â °ÍÀº »ó¼Ó Ŭ·¡½ºÀÇ À©µµ¿ì»ó¿¡¼ Ŭ¸¯Çϸé, WM_LBUTTONDOWN
¸Þ¼¼Áö°¡ üÀÎóÀÇ base class¿¡ º¸³»Á® ¸Þ½ÃÁö ¹Ú½º°¡ Ç¥½ÃµÈ´Ù°í ÇÏ´Â ¿¹ÀÔ´Ï´Ù.
|
// base class class CBaseMsgWindow : public CWindowImpl<CBaseMsgWindow> { BEGIN_MSG_MAP(CBaseMsgWindow)
MESSAGE_HANDLER(WM_LBUTTONDOWN, OnButtonDown) END_MSG_MAP() LRESULT OnButtonDown(UINT, WPARAM, LPARAM, BOOL&) { MessageBox(_T("Hello!")); return 0; } }; // »ó¼Ó
Ŭ·¡½º 1 class CHelloWindow : public CBaseMsgWindow { BEGIN_MSG_MAP(CHelloWindow)
...
CHAIN_MSG_MAP(CBaseMsgWindow) // üÀÎóÀÇ base class¸¦ ÁöÁ¤ END_MSG_MAP() }; // »ó¼Ó
Ŭ·¡½º 2 class CHelloWindow2 : public CBaseMsgWindow {
BEGIN_MSG_MAP(CHelloWindow2) ...
CHAIN_MSG_MAP(CBaseMsgWindow) // üÀÎóÀÇ base class¸¦ ÁöÁ¤ END_MSG_MAP() }; |
ÀÌ ¿¹¿¡¼´Â µÎ °³ÀÇ »ó¼Ó Ŭ·¡½º¿Íµµ °á°úÀûÀ¸·Î °°ÀºOnButtonDown()À̶ó°í ÇÏ´Â ¸Þ¼¼Áö Çڵ鷯¸¦ È£ÃâÇÕ´Ï´Ù.
¡¡±×·±µ¥ »ó±âÀÇ ¹æ¹ý¿¡¼´Â »ó¼Ó Ŭ·¡½º¿¡ ÀÇÇØ ´Ù¸¥ ¸Þ¼¼Áö Çڵ鷯¸¦ È£ÃâÇÏ°í ½Í´Ù°í »ý°¢Çϰí À־ ´ç¿¬ÇÕ´Ï´Ù¸¸ ¾ðÁ¦³ª °°ÀºOnButtonDown()¹Û¿¡ ºÒ·Á °¡Áö ¾Ê½À´Ï´Ù. ±×·¯³ª ATLÀÇ ¡¸´ëü ¸Þ¼¼Áö ¸Ê¡¹À» »ç¿ëÇÏ¸é »ó¼Ó Ŭ·¡½º¿¡ ÀÇÇØ ´Ù¸¥ ¸Þ¼¼Áö Çڵ鷯¸¦ È£ÃâÇÏ´Â °ÍÀÌ °¡´ÉÇÕ´Ï´Ù.
´ÙÀ½¿¡ ³ªÅ¸³»´Â °ÍÀº base classÀÇ ¸Þ¼¼Áö ¸ÊÀ» ¼¼ °³ÀÇ ºÎºÐ¿¡ ºÐÇÒÇØ ´ëü ¸Þ¼¼Áö ¸ÊÀ» ÀÛ¼ºÇØ »ó¼Ó Ŭ·¡½º·ÎºÎÅÍ base classÀÇ ´ëü ¸Þ¼¼Áö ¸Ê¿¡ üÀÎ ÇÑ´Ù°í ÇÏ´Â ¿¹ÀÔ´Ï´Ù. ¸Þ¼¼Áö ¸ÊÀ» ºÐÇÒÇÏ·Á¸é ,ALT_MSG_MAP¸ÅÅ©·Î¸¦ »ç¿ëÇÕ´Ï´Ù.
|
// base class class CBaseMsgWindow : public CWindowImpl<CBaseMsgWindow> { // ¸Þ¼¼Áö ¸ÊÀ» ¼¼ °³ÀÇ ºÎºÐ¿¡ ºÐÇÒ BEGIN_MSG_MAP(CBaseMsgWindow)
MESSAGE_HANDLER(WM_LBUTTONDOWN, OnButtonDown) ALT_MSG_MAP(1)
MESSAGE_HANDLER(WM_LBUTTONDOWN, OnButtonDown2) ALT_MSG_MAP(2)
MESSAGE_HANDLER(WM_LBUTTONDOWN, OnButtonDown3) END_MSG_MAP() LRESULT OnButtonDown(UINT, WPARAM, LPARAM, BOOL&) { MessageBox(_T("Hello!")); return 0; } LRESULT
OnButtonDown2(UINT, WPARAM, LPARAM, BOOL&) { MessageBox(_T("Hello,
ATL!")); return 0; } LRESULT
OnButtonDown3(UINT, WPARAM, LPARAM, BOOL&) { MessageBox(_T("Hello,
ATL/WTL!")); return 0; } }; // »ó¼Ó
Ŭ·¡½º 1 class CHelloWindow : public CBaseMsgWindow { BEGIN_MSG_MAP(CHelloWindow)
...
CHAIN_MSG_MAP(CBaseMsgWindow)
// Åë»óÀÇ Ã¼ÀÎ END_MSG_MAP() }; // »ó¼Ó
Ŭ·¡½º 2 class CHelloWindow2 : public CBaseMsgWindow {
BEGIN_MSG_MAP(CHelloWindow2)
...
CHAIN_MSG_MAP_ALT(CBaseMsgWindow, 1) // ´ëü ¸Þ¼¼Áö ¸Ê¿¡ üÀÎ END_MSG_MAP() }; |
¡¡ALT_MSG_MAP¸ÅÅ©·Î¿¡´Â ´ëü ¸Þ¼¼Áö ¸ÊÀ» ½Äº°ÇÏ´Â ¹øÈ£¸¦ ÁöÁ¤ÇÕ´Ï´Ù. »ó±âÀÇ ¿¹¿¡¼´Â Àü¼ú´ë·Î base classÀÇ ¸Þ¼¼Áö ¸ÊÀ» ALT_MSG_MAP¸ÅÅ©·Î¿¡ ÀÇÇØ ¼¼ °³ÀÇ ºÎºÐ¿¡ ºÐÇÒÇϰí ÀÖ½À´Ï´Ù. ù°´Â µðÆúÆ®ÀÇ ¸Þ¼¼Áö ¸ÊÀ¸·Î, µÑ°´Â ¹øÈ£ 1 ·Î ½Äº°µÇ´Â ´ëü ¸Þ¼¼Áö ¸Ê, ¼Â°´Â ¹øÈ£ 2 ·Î ½Äº°µÇ´Â ´ëü ¸Þ¼¼Áö ¸ÊÀÔ´Ï´Ù. µ¡ºÙ¿© µðÆúÆ®ÀÇ ¸Þ¼¼Áö ¸Ê¿¡´Â ¾Ï¹¬Áß¿¡ 0 ¶ó°í ÇÏ´Â ¹øÈ£¸¦ ÇÒ´çÇÒ ¼ö ÀÖ½À´Ï´Ù.
|
// ¸Þ¼¼Áö ¸ÊÀ» ¼¼ °³ÀÇ ºÎºÐ¿¡ ºÐÇÒ BEGIN_MSG_MAP(CBaseMsgWindow) // ù°
MESSAGE_HANDLER(WM_LBUTTONDOWN, OnButtonDown) ALT_MSG_MAP(1) // µÑ°
MESSAGE_HANDLER(WM_LBUTTONDOWN, OnButtonDown2) ALT_MSG_MAP(2) // ¼Â°
MESSAGE_HANDLER(WM_LBUTTONDOWN, OnButtonDown3) END_MSG_MAP() |
¡¡À̰ÍÀ¸·Î base class¿¡ ´ëü ¸Þ¼¼Áö ¸ÊÀ» ÁغñÇÒ ¼ö ÀÖ¾úÀ¸¹Ç·Î ´ÙÀ½¿¡ »ó¼Ó Ŭ·¡½º·ÎºÎÅÍ ´ëü ¸Þ¼¼Áö ¸Ê¿¡ üÀÎ ÇÏ´Â ¹æ¹ýÀÔ´Ï´Ù¸¸ ±×·¯±â À§Çؼ´Â CHAIN_MSG_MAP_ALT¸ÅÅ©·Î¸¦ »ç¿ëÇÕ´Ï´Ù. CHAIN_MSG_MAP_ALT¸ÅÅ©·Î¿¡´Â üÀÎóÀÇ Å¬·¡½º¸í°ú ±× Ŭ·¡½º¿¡ ÀÖ´Â ´ëü ¸Þ¼¼Áö ¸ÊÀÇ ¹øÈ£¸¦ ÁöÁ¤ÇÕ´Ï´Ù.
»ó±âÀÇ ¿¹¿¡¼´Â CHelloWindowŬ·¡½º¿¡¼´Â CBaseMsgWindowŬ·¡½º¿¡ Åë»óÀÇ Ã¼ÀÎÀ» Çϰí ÀÖÀ» »ÓÀ̹ǷΠCBaseMsgWindowŬ·¡½ºÀÇ µðÆúÆ®ÀÇ ¸Þ¼¼Áö ¸Ê¿¡ ÀÖ´Â OnButtonDown()ÀÌ ºÒ·Á °©´Ï´Ù. CHelloWindow2Ŭ·¡½º¿¡¼´Â CBaseMsgWindowŬ·¡½ºÀÇ ´ëü ¸Þ¼¼Áö ¸Ê ¹øÈ£ 1 ¿¡ üÀÎ Çϰí Àֱ⠶§¹®¿¡ OnButtonDown2()°¡ ºÒ·Á °©´Ï´Ù.
ATL´ÂCHAIN_MSG_MAP_ALT()À» Æ÷ÇÔÇØ ´ÙÀ½°ú °°Àº ´ëü ¸Þ¼¼Áö ¸Ê¿ë üÀÎ ¸ÅÅ©·Î¸¦ ÁغñÇØ ÀÖ½À´Ï´Ù.