4.¸Þ½ÃÁö ¸Ê

°¡.¸Þ½ÃÁö ó¸®

ÀÌÀü ¹öÀüÀÇ WTLÀº ¸Þ½ÃÁö Çڵ鷯¸¦ ÀÛ¼ºÇϴµ¥ ´ëÇÑ Áö¿øÀÌ ¾ø¾î ¼öÀÛ¾÷À¸·Î Çڵ鷯¸¦ Ãß°¡ÇØ¾ß Çß´Ù. ±×·¯³ª WTL 8.0ºÎÅʹ Ŭ·¡½º ºä¿Í ¼Ó¼ºÃ¢ÀÇ ¸Þ½ÃÁö ÆäÀÌÁö¸¦ ÅëÇØ Çڵ鷯¸¦ ÀÚµ¿À¸·Î ÀÛ¼ºÇÏ´Â ±â´ÉÀÌ Áö¿øµÇ¾î ÈξÀ ´õ Æí¸®ÇØÁ³´Ù. Çѹø¾¿¸¸ ½Ç½ÀÇØ º¸¸é ¾î·ÆÁö ¾ÊÀ¸¹Ç·Î ¿¹Á¦¸¦ ¸¸µé¾î º¸ÀÚ.

 

¿¹ Á¦ : Messagehandler

¸ÕÀú ¸Þ½ÃÁö¸¦ ó¸®ÇÒ Å¬·¡½º¸¦ Ŭ·¡½º ºä¿¡¼­ ¼±ÅÃÇÑ´Ù. ±×·¯¸é ¼Ó¼ºÃ¢¿¡ ¼±ÅÃµÈ Å¬·¡½ºÀÇ ¼Ó¼ºÀÌ ³ªÅ¸³ª´Âµ¥ »ó´ÜÀÇ ¹öÆ°À» ´­·¯ ¸Þ½ÃÁö ÆäÀÌÁö·Î ÀüȯÇÏ¸é ¹ß»ý °¡´ÉÇÑ ¸Þ½ÃÁö¿¡ ´ëÇÑ ¸ñ·ÏÀÌ ³ªÅ¸³­´Ù. ¿©±â¼­ ó¸®ÇÏ°íÀÚ ÇÏ´Â ¸Þ½ÃÁö¸¦ ¼±ÅÃÇÏ¸é µÈ´Ù. ¿¹¸¦ µé¾î ºä¿¡¼­ WM_CREATE ¸Þ½ÃÁö¸¦ ó¸®ÇÏ°í ½Í´Ù°í ÇØ º¸ÀÚ.

 

Ŭ·¡½º ºä¿¡¼­ CMessageHandlerView Ŭ·¡½º¸¦ ¼±ÅÃÇÏ°í ¼Ó¼ºÃ¢ÀÇ ¸Þ½ÃÁö ÆäÀÌÁö¸¦ ¿­¾î º¸¸é ºä¿¡¼­ ¹ß»ýÇÒ ¼ö ÀÖ´Â ¸Þ½ÃÁö°¡ ³ª¿­µÇ¸ç ÀÌ¹Ì Çڵ鷯°¡ ÀÛ¼ºµÇ¾î ÀÖ´Â ¸Þ½ÃÁö¿¡ ´ëÇؼ­´Â ¿À¸¥ÂÊ¿¡ Çڵ鷯ÀÇ À̸§À¸ Ç¥½ÃµÈ´Ù. WM_CREATEÀÇ ÄÞº¸ ¹Ú½º¿¡¼­ <Ãß°¡>¸¦ ¼±ÅÃÇϸé ÀÌ ¸Þ½ÃÁö¸¦ ó¸®Çϱâ À§ÇÑ ¸ðµç Á¶Ä¡°¡ ÀÚµ¿À¸·Î ¼öÇàµÈ´Ù. ¸ÕÀú Çì´õ ÆÄÀÏÀÇ ¸Þ½ÃÁö ¸Ê¿¡ ¿£Æ®¸®°¡ Ãß°¡µÈ´Ù. WM_PAINT Çڵ鷯´Â ¸¶¹ý»ç°¡ ¹Ì¸® ¸¸µé¾î ³õÀº °ÍÀÌ´Ù.

 

     BEGIN_MSG_MAP(CMessageHandlerView)

          MESSAGE_HANDLER(WM_PAINT, OnPaint)

          MESSAGE_HANDLER(WM_CREATE, OnCreate)

     END_MSG_MAP()

 

ÀÌ ¿£Æ®¸®¿¡ ÀÇÇØ WM_CREATE ¸Þ½ÃÁö¿¡ ´ëÇØ OnCreate ÇÔ¼ö°¡ È£ÃâµÇ´Â °ÍÀÌ´Ù. Çì´õ ÆÄÀÏ¿¡ OnCreate ÇÔ¼öÀÇ ¿øÇüÀÌ ¼±¾ðµÈ´Ù. ¸Þ½ÃÁö ID¿Í ÆĶó¹ÌÅÍ, ¸Þ½ÃÁö ó¸® ¿©ºÎ¸¦ ¸®ÅÏÇÏ´Â ÂüÁ¶ Àμö°¡ Àü´ÞµÈ´Ù.

 

     LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/);

 

±×¸®°í ±¸Çö ÆÄÀÏ¿¡´Â Çڵ鷯 ÇÔ¼öÀÇ º»Ã¼°¡ »ý¼ºµÈ´Ù. Çü½Ä ÀμöµéÀÌ ÁÖ¼® 󸮵Ǿî Àִµ¥ ÀÌÁß »ç¿ëÇÏ°í ½ÍÀº °Í¸¸ ÁÖ¼®À» Ç®¾î¼­ »ç¿ëÇÏ¸é µÈ´Ù. ¿Ö Çü½Ä ÀμöµéÀ» ÁÖ¼®À¸·Î ¹­¾î ³õ´Â°¡ Çϸé Àμö¸¦ ¾²Áö ¾ÊÀ¸¸é ºÒÇÊ¿äÇÑ °æ°í°¡ ¹ß»ýÇϱ⠶§¹®ÀÌ´Ù. º»Ã¼ ³»ºÎ´Â ºñ¾î ÀÖ°í ÄÚµå ÀÛ¼º ÁöħÀÌ ÁÖ¼®¹®À¸·Î¸¸ Ç¥±âµÇ¾î ÀÖ´Ù. ÁÖ¼®¹®À» Áö¿ì°í ÀÌ ÀÚ¸®¿¡ ¿øÇÏ´Â Äڵ带 ÀÛ¼ºÇÑ´Ù.

 

LRESULT CMessageHandlerView::OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)

{

     // TODO: ¿©±â¿¡ ¸Þ½ÃÁö 󸮱â Äڵ带 Ãß°¡ ¹×/¶Ç´Â ±âº»°ªÀ» È£ÃâÇÕ´Ï´Ù.

 

     return 0;

}

 

±×·³, °£´ÜÇÏ°Ô ½Ã°è¸¦ ¸¸µé¾î º¸ÀÚ. ŸÀÌ¸Ó ¼³Ä¡ ¹× ÇØÁ¦, ŸÀÌ¸Ó ¸Þ½ÃÁö ó¸®, ½Ã°£ Ãâ·Â µîÀ» À§ÇØ 4°³ÀÇ Çڵ鷯¸¦ ÀÛ¼ºÇØ¾ß ÇÑ´Ù. ¸ÕÀú Çì´õ ÆÄÀÏ¿¡ ÇöÀç ½Ã°£À» ÀúÀåÇÒ ¹®ÀÚ¿­À» ¼±¾ðÇÑ´Ù. CStringÀº atlmisc.h¿¡ Á¤ÀǵǾî ÀÖÀ¸¹Ç·Î ÀÌ ÆÄÀÏÀ» ¸ÕÀú ÀÎŬ·çµåÇØ¾ß ÇÑ´Ù.

 

#include <atlmisc.h>

class CMessageHandlerView : public CWindowImpl<CMessageHandlerView>

{

public:

     CString sTime;

 

±¸Çö ÆÄÀÏ¿¡ WM_DESTROY¿Í WM_TIMER¿¡ ´ëÇØ 2°³ÀÇ Çڵ鷯¸¦ ´õ »ý¼ºÇÏ°í ´ÙÀ½ Äڵ带 ÀÛ¼ºÇÑ´Ù. ÄÚµå¾çÀÌ ¸¹¾Æ º¸ÀÌÁö¸¸ ´ëºÎºÐ ¸¶¹ý»ç°¡ ÀÚµ¿À¸·Î »ý¼ºÇÑ °ÍÀ̹ǷΠ½ÇÁ¦·Î ÀÔ·ÂÇØ¾ß ÇÒ ÄÚµå´Â ¾ó¸¶ µÇÁö ¾Ê´Â´Ù.

 

LRESULT CMessageHandlerView::OnPaint(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)

{

     CPaintDC dc(m_hWnd);

 

     dc.TextOut(10,10,sTime);

 

     return 0;

}

 

LRESULT CMessageHandlerView::OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)

{

     SetTimer(1,1000);

 

     return 0;

}

 

LRESULT CMessageHandlerView::OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)

{

     KillTimer(1);

 

     return 0;

}

 

LRESULT CMessageHandlerView::OnTimer(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/)

{

     SYSTEMTIME st;

 

     switch (wParam) {

     case 1:

          GetLocalTime(&st);

          sTime.Format(TEXT("%d:%d:%d"),st.wHour,st.wMinute,st.wSecond);

          Invalidate();

          break;

     }

 

     return 0;

}

 

WM_CREATE¿¡¼­ 1¹ø ŸÀ̸Ӹ¦ ¼³Ä¡ÇÏ°í WM_DESTROY¿¡¼­ ÇØÁ¦ÇÑ´Ù. ÀÌ µÎ ¸Þ½ÃÁö´Â Àμö·Î Ưº°È÷ Àü´ÞµÇ´Â ³»¿ëÀÌ ¾øÀ¸¹Ç·Î Àμö¸¦ »ç¿ëÇÏÁö ¾Ê¾Ò´Ù. OnTimer Çڵ鷯´Â ¾î¶² ŸÀ̸ӷκÎÅÍ ¸Þ½ÃÁö°¡ ¹ß»ýÇß´ÂÁö¸¦ wParamÀ» ÅëÇØ Àоî¾ß ÇϹǷΠwParamÀ» ÁÖ¼® ÇØÁ¦Çß´Ù. GetLocalTime ÇÔ¼ö·Î ÇöÀç ½Ã°£À» ±¸ÇØ sTime ¹®ÀÚ¿­¿¡ ´ëÀÔÇØ ³õÀ¸¸é OnPaint¿¡¼­ ÀÌ ¹®ÀÚ¿­À» È­¸éÀ¸·Î Ãâ·ÂÇÑ´Ù.

¸Å Ãʸ¶´Ù ½Ã°£ÀÌ °»½ÅµÇ¹Ç·Î ½Ã°è°¡ 1ÃÊ ´ÜÀ§·Î °»½ÅµÉ °ÍÀÌ´Ù. º¸´Ù½ÃÇÇ »õº®¿¡ Àáµµ ¸øÀÚ°í °­Á¸¦ ¾²°í ÀÖ´Â ÁßÀÌ´Ù. ´ÙÀ½Àº ¸¶¿ì½º ¿ÞÂÊ ¹öÆ°À» ´©¸¦ ¶§ ´©¸¥ À§Ä¡¿¡ "Click"À̶ó´Â ¹®ÀÚ¿­À» Ãâ·ÂÇØ º¸ÀÚ. WM_LBUTTONDOWN ¸Þ½ÃÁö¿¡ ´ëÇÑ Çڵ鷯¸¦ ¸¸µé°í ´ÙÀ½ Äڵ带 ÀÛ¼ºÇÑ´Ù.

 

LRESULT CMessageHandlerView::OnLButtonDown(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/)

{

     CClientDC dc(m_hWnd);

    

     dc.TextOut(LOWORD(lParam),HIWORD(lParam),TEXT("Click"));

 

     return 0;

}

 

Ŭ¸¯ÇÑ À§Ä¡ÀÇ ÁÂÇ¥°¡ lParamÀ¸·Î Àü´ÞµÇ¹Ç·Î lParamÀÇ ÁÖ¼®À» Ç®°í »óÇÏÀ§ ¿öµå¸¦ ºÐ¸®ÇÏ¿© ÁÂÇ¥¸¦ ¾ò´Â´Ù. ÀÌ ÁÂÇ¥¿¡ "Click"À̶ó´Â ¹®ÀÚ¿­À» Ãâ·ÂÇß´Ù. wParamÀ¸·Î´Â Á¶ÇÕÅ°ÀÇ »óÅ°¡ Àü´ÞµÇ´Âµ¥ ÀÌ ¿¹Á¦¿¡¼­´Â ´çÀå »ç¿ëÇÏÁö ¾ÊÀ¸¹Ç·Î ÁÖ¼®À» Ç®Áö ¾Ê¾Ò´Ù. ¸¶Áö¸· Àμö bHandled´Â ¸Þ½ÃÁö¸¦ ó¸®Çߴ°¡ ¾Æ´Ñ°¡¸¦ ¸®ÅÏÇÏ´Â ÂüÁ¶ ÀμöÀÌ´Ù. µðÆúÆ®´Â TRUEÀÌÁö¸¸ FALSE·Î º¯°æÇϸé ó¸®ÇÏÁö ¾ÊÀº °ÍÀ¸·Î Àü´ÞµÇ¾î ¿î¿µÃ¼Á¦¿¡ ÀÇÇØ µðÆúÆ® 󸮵ȴÙ.

±×·±µ¥ uMsg Àμö´Â ¿Ö Àü´ÞµÇ´Â °ÍÀϱî? °¢ Çڵ鷯º°·Î Àü´ã ¸Þ½ÃÁö°¡ Á¤ÇØÁ® ÀÖÀ¸¹Ç·Î ±»ÀÌ ¸Þ½ÃÁö ID¸¦ Àμö·Î Àü´ÞÇÒ ÇÊ¿ä°¡ ¾ø¾î º¸ÀδÙ. °ú¿¬ ±×·¸±â´Â ÇÏ´Ù. OnTimer°¡ ó¸®ÇÏ´Â ¸Þ½ÃÁö´Â WM_TIMERÀÌ°í OnPaint°¡ ó¸®ÇÏ´Â ¸Þ½ÃÁö´Â Ç×»ó OnPaintÀÌ´Ù. ±×·¯³ª °¡²û ¸Þ½ÃÁö Çڵ鷯 Çϳª°¡ ¿©·¯ °³ÀÇ ¸Þ½ÃÁö¸¦ ÅëÇÕ Ã³¸®ÇÏ´Â °æ¿ìµµ ÀÖÀ¸¹Ç·Î ¸Þ½ÃÁö ID°¡ ¿øÇü¿¡ Æ÷ÇԵǾî ÀÖ´Ù.

¿¹¸¦ µé¾î WM_KEYDOWN°ú WM_KEYUPÀ» OnKeyInputÀ̶ó´Â ÇÔ¼ö Çϳª°¡ ¸ðµÎ ¹ÞÀ» ¼öµµ ÀÖÀ¸¸ç ÀÌ °æ¿ì ¾î¶² ¸Þ½ÃÁö¿¡ ÀÇÇØ ÇÔ¼ö°¡ È£ÃâµÇ¾ú´ÂÁö uMsg Àμö·ÎºÎÅÍ ÆǺ°ÇÒ ¼ö ÀÖ´Ù. ±×·± °æ¿ì°¡ ¾Æ´Ï¶ó¸é uMsg Àμö´Â ±»ÀÌ »ç¿ëÇÏÁö ¾Ê¾Æµµ »ó°ü¾ø´Ù.

³ª.¸Þ½ÃÁö Å©·¡Ä¿

¼Ó¼ºÃ¢À» ÅëÇØ ¸Þ½ÃÁö Çڵ鷯¸¦ ½±°Ô Ãß°¡ÇÒ ¼ö ÀÖ´Ù´Â ¸é¿¡¼­ Æí¸®Çϸç MFC¿Í °°Àº ¹æ¹ýÀ̶ó Àͼ÷Çϱ⵵ ÇÏ´Ù. ±×·¯³ª MFCº¸´Ù´Â ¿ª½Ã ÇÑ ¼ö ¾Æ·¡Àε¥ ¸Þ½ÃÁö¿Í ÇÔ¼ö¸¦ ¿¬°á¸¸ ÇØ ÁÙ»Ó ¸Þ½ÃÁöÀÇ Àμö¸¦ ºÐ¸®ÇØ ÁÖÁö´Â ¾Ê´Â´Ù. ¸¶¿ì½º ÁÂÇ¥¸¦ Á¤¼öÇü µÎ °³³ª Point °´Ã¼·Î Àü´ÞÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó lParamÀ¸·Î Àü´ÞÇϹǷΠÁ÷Á¢ ºÐ¸®Çؼ­ »ç¿ëÇØ¾ß ÇÏ´Â ºÒÆíÇÔÀÌ ÀÖ´Ù. ¸Þ½ÃÁöÀÇ Àμö Àǹ̸¦ ¸ðµÎ ¿Ü¿ì°í ´Ù´Ò ¼ö´Â ¾øÀ¸¹Ç·Î ÇÊ¿äÇÒ ¶§¸¶´Ù MSDNÀ» ÂüÁ¶ÇØ¾ß ÇÑ´Ù.

WTL¿¡´Â ¸Þ½ÃÁö¸¦ ºÐ¸®ÇØ ÁÖ´Â ¸ÅÅ©·Îµµ Á¤ÀǵǾî ÀÖ±â´Â ÇÏÁö¸¸ °³¹ßÅøÀÌ Á÷Á¢ÀûÀ¸·Î Áö¿øÇÏÁö ¾ÊÀ¸¹Ç·Î ¼öÀÛ¾÷À¸·Î ¸Þ½ÃÁö ¸ÊÀ» ÆíÁýÇØ¾ß ÇÑ´Ù. ±¸Á¶ÀûÀ¸·Î´Â ÀÌ ¹æ¹ýÀÌ ´õ Æí¸®ÇÏÁö¸¸ °³¹ßÅøÀÇ Áö¿øÀÌ ¾ø¾î ¿ÀÈ÷·Á ´õ ºÒÆíÇÏ´Ù. ¾Õ ¿¹Á¦¿Í ¶È°°Àº ¿¹Á¦¸¦ ¸Þ½ÃÁö Å©·¡Ä¿·Î ÀÛ¼ºÇØ º¸ÀÚ.

 

¿¹ Á¦ : MessageCracker

ºäÀÇ Çì´õ ÆÄÀÏÀ» ¿­¾î ´ÙÀ½ ¼Ò½º¸¦ ÀÔ·ÂÇÑ´Ù. °³¹ßÅøÀÇ Áö¿øÀÌ °ÅÀÇ ¾øÀ¸¹Ç·Î ¸ðÁ¶¸® ¼ÕÀ¸·Î ´Ù Á÷Á¢ ÀÔ·ÂÇØ¾ß ÇÑ´Ù.

 

#include <atlmisc.h>

#include <atlcrack.h>

 

class CMessageCrackerView : public CWindowImpl<CMessageCrackerView>

{

public:

     DECLARE_WND_CLASS(NULL)

     CString sTime;

 

     BOOL PreTranslateMessage(MSG* pMsg);

 

     BEGIN_MSG_MAP_EX(CMessageCrackerView)

          MESSAGE_HANDLER(WM_PAINT, OnPaint)

          MSG_WM_CREATE(OnCreate)

          MSG_WM_DESTROY(OnDestroy)

          MSG_WM_TIMER(OnTimer)

          MSG_WM_LBUTTONDOWN(OnLButtonDown);

     END_MSG_MAP()

 

     LRESULT OnPaint(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/);

     int OnCreate(LPCREATESTRUCT lpCreateStruct);

     void OnDestroy();

     void OnTimer(UINT_PTR nIDEvent);

     void OnLButtonDown(UINT nFlags, CPoint point);

};

 

¸Þ½ÃÁö Å©·¡Ä¿´Â atlcrack.h¿¡ ÀÇÇØ Á¦°øµÇ¹Ç·Î ¸ÕÀú ÀÌ Çì´õ ÆÄÀÏÀ» ÀÎŬ·çµåÇÑ´Ù. ±×¸®°í ¸Þ½ÃÁö ¸ÊÀÇ ½ÃÀÛ ¸ÅÅ©·Î¸¦ BEGIN_MSG_MAP_EX·Î º¯°æÇÑ´Ù. ´Ü¼ø ¹öÀü¿¡ ºñÇØ µÚ¿¡ _EX°¡ ´õ ºÙ¾î ÀÖ´Ù. ¸¶¹ý»ç°¡ ¸¸µé¾î ³õÀº OnPaint´Â ±×´ë·Î µÎ°í »õ·Î ¸¸µå´Â OnCreateºÎÅÍ´Â MSG_WM_XXX ½ÄÀ¸·Î XXXÀÚ¸®¿¡ ó¸®ÇÏ°íÀÚ ÇÏ´Â ¸Þ½ÃÁö À̸§À» ¾²°í °ýÈ£¾È¿¡ ÀÌ ¸Þ½ÃÁö¸¦ ¹ÞÀ» Çڵ鷯 ÇÔ¼ö¸¦ ¾²¸é µÈ´Ù.

Çڵ鷯 ÇÔ¼öÀÇ ¿øÇüÀº ¾Æ·¡ÂÊ¿¡ ¼±¾ðÇØ µÎ¾ú´Ù. ¸Þ½ÃÁöÀÇ Á¾·ù¿¡ µû¶ó ¹Þ¾ÆµéÀÌ´Â Àμö°¡ ´Ù¸£¹Ç·Î Çڵ鷯ÀÇ ¿øÇüµµ ¸Þ½ÃÁö¸¶´Ù ´Ù¸£´Ù. ±¸Çö ÆÄÀÏ¿¡´Â °¢ Çڵ鷯 ÇÔ¼öÀÇ º»Ã¼¸¦ ÀÛ¼ºÇÑ´Ù. Çü½ÄÀÌ Á¶±Ý ´Ù¸¦ »Ó ¾Õ ¿¹Á¦¿Í ³»¿ëÀº °°´Ù.

 

LRESULT CMessageCrackerView::OnPaint(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)

{

     CPaintDC dc(m_hWnd);

 

     dc.TextOut(10,10,sTime);

 

     return 0;

}

 

int CMessageCrackerView::OnCreate(LPCREATESTRUCT lpcs)

{

     SetTimer(1,1000);

     return 0;

}

 

void CMessageCrackerView::OnDestroy()

{

     KillTimer(1);

}

 

void CMessageCrackerView::OnTimer(UINT_PTR nIDEvent)

{

     SYSTEMTIME st;

 

     switch (nIDEvent) {

     case 1:

          GetLocalTime(&st);

          sTime.Format(TEXT("%d:%d:%d"),st.wHour,st.wMinute,st.wSecond);

          Invalidate();

          break;

     }

}

 

void CMessageCrackerView::OnLButtonDown(UINT nFlags, CPoint point)

{

     CClientDC dc(m_hWnd);

    

     dc.TextOut(point.x,point.y,TEXT("Click"));

}

 

OnTimer ÇÔ¼ö´Â ŸÀÌ¸Ó ¸Þ½ÃÁö¸¦ ¹ß»ý½ÃŲ ŸÀ̸ÓÀÇ ID¸¦ Àμö·Î Àü´Þ¹ÞÀ¸¹Ç·Î ÀÌ °ªÀ» ¹Ù·Î ÀÐÀ¸¸é µÈ´Ù. OnLButtonDownÀº ´­·¯Áø ÁÂÇ¥¸¦ CPoint °´Ã¼·Î ¹ÞÀ¸¹Ç·Î lParamÀ» Á÷Á¢ »óÇÏÀ§·Î ÂÉ°³¼­ ÀÐÁö ¾Ê¾Æµµ µÈ´Ù. Àμö°¡ ºÐ¸®µÇ¾î Àü´ÞµÇ¹Ç·Î °ú¿¬ Æí¸®Çϱâ´Â ÇÏ´Ù. ±×·¸´Ù¸é °¢ ¸Þ½ÃÁöÀÇ Çڵ鷯 ÇÔ¼ö ¿øÇüÀº ¾î¶»°Ô ¾Ë ¼ö ÀÖÀ»±î? Àμö¸¦ ¾î¶²½ÄÀ¸·Î ºÐ¸®ÇÏ´ÂÁö MSDNÀ» ¸Å¹ø µÚÁ®º¼ ¼ö´Â ¾ø´Â ³ë¸©ÀÌ´Ù.

WTLÀº ÀÌ¿¡ ´ëÇØ º°´Ù¸¥ ÇØ°áÃ¥À» Á¦°øÇÏÁö´Â ¾ÊÁö¸¸ atlcrack.h Çì´õ ÆÄÀÏ¿¡ ÁÖ¼®À¸·Î Çڵ鷯 ÇÔ¼öÀÇ ¿øÇüÀ» ±â·ÏÇØ ³õ¾Ò´Ù. Çì´õ ÆÄÀÏÀ» ÂüÁ¶ÇÏ¿© ¿øÇüÀ» º¹»çÇØ ¿À¸é µÈ´Ù. ¿¹¸¦ µé¾î WM_LBUTTONDOWN ¸Þ½ÃÁö¿¡ ´ëÇÑ Çڵ鷯¸¦ ÀÛ¼ºÇÏ°í ½Í´Ù¸é MSG_WM_LBUTTONDOWN ¸ÅÅ©·Î ¼±¾ð¹®À» ÂüÁ¶ÇÑ´Ù. F12¸¦ ´©¸£¸é ¸ÅÅ©·Î ¼±¾ðºÎ·Î Áï½Ã À̵¿ÇÑ´Ù.

 

// void OnLButtonDown(UINT nFlags, CPoint point)

#define MSG_WM_LBUTTONDOWN(func) \

     if (uMsg == WM_LBUTTONDOWN) \

     { \

          SetMsgHandled(TRUE); \

          func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \

          lResult = 0; \

          if(IsMsgHandled()) \

              return TRUE; \

     }

 

¸ÅÅ©·Î Á¤Àǹ® À§¿¡ Çڵ鷯 ÇÔ¼öÀÇ ¿øÇüÀÌ ÁÖ¼®À¸·Î ¸í½ÃµÇ¾î ÀÖ´Ù. ÀÌ ÁÖ¼®À» º¹»çÇؼ­ ¿øÇü ¼±¾ðÇÏ°í º»Ã¼¸¦ ¸¸µç´Ù. Ưº°ÇÑ ±â¼úÀÌ ÀÖ´Â °ÍÀº ¾Æ´Ï°í °³¹ßÀÚ°¡ º»¾÷ÀÎ Ctrl+C, Ctrl+VÁú¸¸ ¸î ¹ø ÇÏ¸é µÈ´Ù. Á÷Á¢ ŸÀÌÇÎÇÏ´Â ¼ö°íº¸´Ù´Â ³´Áö¸¸ ¾î·µç ¼öÀÛ¾÷À̱⠶§¹®¿¡ MFC¸¸Å­ Æí¸®ÇÏÁö´Â ¾Ê´Ù.

¸Þ½ÃÁö Å©·¡Ä¿¸¦ ¾µ °ÍÀΰ¡ ¾Æ´Ï¸é °³¹ßÅøÀÌ Áö¿øÇÏ´Â ´Ü¼ø ¸Þ½ÃÁö ¸ÊÀ» ¾µ °ÍÀΰ¡´Â ÃëÇâ¿¡ µû¶ó ¼±ÅÃÇØ¾ß ÇÒ ¹®Á¦ÀÌµÇ ³ª °°À¸¸é ±×³É °³¹ßÅøÀÇ Áö¿øÀ» ¹Þ¾Æ Çڵ鷯¸¦ ¸¸µé°í Àμö´Â ³»°¡ Àû´çÈ÷ ¾Ë¾Æ¼­ Àß¶ó¼­ ¾²´Â ÂÊÀ» ÅÃÇÒ °Í °°´Ù. ¸Þ½ÃÁö Å©·¡Ä¿ Áö¿ø±îÁö ¹Ù¶õ´Ù¸é Â÷¶ó¸® MFC¸¦ ¾²´Â °ÍÀÌ ´õ ¾î¿ï¸®Áö ¾ÊÀ»±î.

´Ù.¸í·É Çڵ鷯

¸í·ÉÀ̶õ ±¸Ã¼ÀûÀ¸·Î WM_COMMAND ¸Þ½ÃÁö¸¦ ÀǹÌÇϸç WM_NOTIFYµµ ¸í·ÉÀ¸·Î ºÐ·ùµÈ´Ù. ÀÌ µÎ ¸Þ½ÃÁö´Â ÁÖ·Î Â÷Àϵå·ÎºÎÅÍ Àü´ÞµÇ´Â ÅëÁö ¸Þ½ÃÁö¸¦ ó¸®ÇÏ´Â ¿ªÇÒÀ» ÇÑ´Ù. ¿î¿µÃ¼Á¦ÀÇ ÀÔÀå¿¡¼­ º¼ ¶§ ´Ù¸¥ ¸Þ½ÃÁö¿Í º°¹Ý ´Ù¸¦ °ÍÀÌ ¾øÁö¸¸ Â÷ÀϵåÀÇ ¼ö°¡ ±²ÀåÀÌ ¸¹À» ¼ö ÀÖ°í ÅëÁö Äڵ尡 ÄÁÆ®·Ñº°·Î ¼¼ºÐÈ­µÇ¾î ÀÖ´Ù´Â Á¡ÀÌ ´Ù¸£´Ù.

ÀÌ ¸Þ½ÃÁö¿¡ ´ëÇÑ Çڵ鷯¸¦ ÀÏ¹Ý ÇÔ¼ö Çϳª·Î ¸¸µé°Ô µÇ¸é °Å´ëÇÑ switch¹®À» ÀÛ¼ºÇØ¾ß Çϸç Çڵ鷯ÀÇ ±æÀ̵µ Áö³ªÄ¡°Ô ±æ¾îÁö´Â ¹®Á¦Á¡ÀÌ ÀÖ´Ù. ±×·¡¼­ MFC¿Í WTLÀº ÀÌ µÎ ¸Þ½ÃÁö¸¦ ´Ù¸¥ ¸Þ½ÃÁö¿Í´Â Á¶±Ý ´Ù¸£°Ô ó¸®ÇÑ´Ù. ÄÁÆ®·Ñº°·Î, ÅëÁö ¸Þ½ÃÁöº°·Î ¼¼ºÐÈ­ÇÏ¿© Çڵ鷯 ÇÔ¼ö¸¦ µû·Î ¸¸µé ¼ö ÀÖµµ·Ï µÇ¾î ÀÖ´Ù.

 

¿¹ Á¦ : WTLMenu

WTLMenu¶ó´Â À̸§À¸·Î ÇÁ·ÎÁ§Æ®¸¦ ¸¸µé¾î º¸ÀÚ. ¸¶¹ý»ç°¡ ¸¸µç ÇÁ·ÎÁ§Æ®¿¡´Â ±âº» ¸Þ´º°¡ ÀÌ¹Ì Æ÷ÇԵǾî Àִµ¥ ²®µ¥±â¸¸ ¸¸µé¾îÁ® ÀÖÀ» »Ó MFC ¼öÁØÀÇ ±¸ÇöÀº Á¦°øµÇÁö ¾Ê´Â´Ù. File ¸Þ´ºÀÇ OpenÀ» ¼±ÅÃÇصµ ÆÄÀÏ ¿­±â ´ëÈ­»óÀÚ°¡ ¿­¸®Áö ¾ÊÀ¸¸ç Edit ¸Þ´ºÀÇ Ç׸ñµéµµ ´ëºÎºÐ ¸Þ´º¸¸ ¸¸µé¾îÁ® ÀÖ´Â »óÅÂÀÌ´Ù.

ÀÌ ¸Þ´ºÀÇ ±¸Çö ÄÚµå´Â »ç¿ëÀÚ°¡ Á÷Á¢ ÀÛ¼ºÇØ ³Ö¾î¾ß ÇÑ´Ù. ¿©±â¼­´Â ¾Æ¿¹ »õ·Î¿î Ç׸ñÀ» Ãß°¡ÇÏ°í ¸í·É Çڵ鷯¸¦ ÀÛ¼ºÇØ º¸ÀÚ. View ¸Þ´ºÀÇ ¾Æ·¡ÂÊ¿¡ Message Box Ç׸ñÀ» Ãß°¡ÇÑ´Ù. ID´Â ÀÚµ¿À¸·Î ID_VIEW_MESSAGEBOX¶ó°í ºÙ´Âµ¥ µðÆúÆ®°¡ ¹«³­ÇϹǷΠÀÌ´ë·Î »ç¿ëÇÏ¸é µÈ´Ù.

¸Þ´º ¸í·É¿¡ ´ëÇÑ Çڵ鷯¸¦ ÀÛ¼ºÇÏ´Â ¹æ¹ýµµ ¸Þ½ÃÁö Çڵ鷯¸¦ ¸¸µå´Â ¹æ¹ý°ú µ¿ÀÏÇ쵂 ¼Ó¼ºÃ¢ÀÇ ¸Þ½ÃÁö ÆäÀÌÁö°¡ ¾Æ´Ñ À̺¥Æ® ÆäÀÌÁö¸¦ »ç¿ëÇÑ´Ù´Â Á¡ÀÌ ´Ù¸£´Ù. Ŭ·¡½º ºä¿¡¼­ CMainFrameÀ» ¼±ÅÃÇØ ³õ°í ¼Ó¼ºÃ¢ÀÇ À̺¥Æ® ÆäÀÌÁö¿¡¼­ ÀÌ Ç׸ñ¿¡ ´ëÇÑ Çڵ鷯¸¦ Ãß°¡ÇÑ´Ù. ¸Þ´º´Â ¸ÞÀÎ À©µµ¿ì¿¡ ºÙ¾î ÀÖ´Â °ÍÀÌ¸ç ¸Þ´º Ç׸ñ¿¡ ´ëÇØ WM_COMMAND¸¦ ¹Þ´Â ÁÖü°¡ ¸ÞÀÎ À©µµ¿ìÀ̹ǷΠºä¿¡ Çڵ鷯¸¦ Ãß°¡Çؼ­´Â ¾ÈµÈ´Ù.

¸í·É Çڵ鷯¸¦ ÀÛ¼ºÇÏ¸é ¸Þ½ÃÁö ¸Ê¿¡ COMMAND_ID_HANDLER ¿£Æ®¸®°¡ Ãß°¡µÈ´Ù.

 

     BEGIN_MSG_MAP(CMainFrame)

          MESSAGE_HANDLER(WM_CREATE, OnCreate)

          MESSAGE_HANDLER(WM_DESTROY, OnDestroy)

          COMMAND_ID_HANDLER(ID_APP_EXIT, OnFileExit)

          COMMAND_ID_HANDLER(ID_FILE_NEW, OnFileNew)

          COMMAND_ID_HANDLER(ID_VIEW_TOOLBAR, OnViewToolBar)

          COMMAND_ID_HANDLER(ID_VIEW_STATUS_BAR, OnViewStatusBar)

          COMMAND_ID_HANDLER(ID_APP_ABOUT, OnAppAbout)

          COMMAND_ID_HANDLER(ID_VIEW_MESSAGEBOX, OnViewMessagebox)

          CHAIN_MSG_MAP(CUpdateUI<CMainFrame>)

          CHAIN_MSG_MAP(CFrameWindowImpl<CMainFrame>)

     END_MSG_MAP()

 

¸í·ÉÀ» ¹ß»ý½ÃÅ°´Â ¸Þ´ºÀÇ ID¿Í ÀÌ ¸í·ÉÀ» ó¸®ÇÒ ÇÔ¼öÀÇ À̸§ÀÌ ¿£Æ®¸®¿¡ ÀÛ¼ºµÈ´Ù. ´ëÃæ º¸¸é ¾î¶² Çü½ÄÀÎÁö °¨À» ÀâÀ» ¼ö ÀÖ´Ù. ±×¸®°í ¸í·É Çڵ鷯ÀÇ ¿øÇüÀÌ ¼±¾ðµÇ°í ±¸Çö ÆÄÀÏ¿¡´Â º»Ã¼°¡ ÀÛ¼ºµÈ´Ù. º»Ã¼¾È¿¡ ¿øÇÏ´Â Äڵ带 ÀÛ¼ºÇÑ´Ù.

 

LRESULT CMainFrame::OnViewMessagebox(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)

{

     MessageBox(TEXT("¸Þ½ÃÁö ¹Ú½ºÀÔ´Ï´Ù."),TEXT("¸Þ·Õ"));

 

     return 0;

}

 

¸í·ÉÀ» Á¦´ë·Î Àü´Þ¹Þ¾ÒÀ½À» È®ÀÎÇϱâ À§ÇØ ¸Þ½ÃÁö ¹Ú½º¸¸ ¿­¾î º¸¾Ò´Ù. ¹°·Ð ½ÇÁ¦ ÇÁ·ÎÁ§Æ®¿¡¼­´Â ¸í·É¿¡ µû¸¥ 󸮸¦ ¼öÇàÇØ¾ß ÇÑ´Ù.

¸Þ´º´Â ´Ü¼øÈ÷ ¼±Åø¸ ÇϹǷΠÅëÁö ÄÚµå µûÀ§¸¦ Á¡°ËÇÒ ÇÊ¿ä°¡ ¾øÁö¸¸ Â÷Àϵå ÄÁÆ®·ÑÀÇ °æ¿ì´Â ÅëÁö ¸Þ½ÃÁö¿¡ µû¶ó ´Ù¸¥ 󸮸¦ Çϱ⵵ ÇØ¾ß ÇÑ´Ù. ÅëÁö ¸Þ½ÃÁöÀÇ Á¾·ù´Â MSDNÀ» ÂüÁ¶ÇØ¾ß ÇÏ°í switch¹®À» ±¸¼ºÇÏ¿© Win32 ½ÄÀ¸·Î ÄÚµùÇØ¾ß ÇÑ´Ù. ÅëÁö ¸Þ½ÃÁö³ª ÄÁÆ®·Ñ IDº°·Î Çڵ鷯¸¦ ÇÒ´çÇÏ´Â ¸ÅÅ©·Îµµ Á¤ÀǵǾî ÀÖ±â´Â ÇÏÁö¸¸ ¼öÀÛ¾÷À» ÇØ¾ß ÇϹǷΠºÒÆíÇÏ´Ù.

´ÙÀ½Àº Å°º¸µå ¿¢¼¿·¯·¹ÀÌÅ͸¦ Á¤ÀÇÇØ º¸ÀÚ. ¸®¼Ò½º ºä¿¡¼­ ¿¢¼¿·¯·¹ÀÌÅÍ Å×À̺íÀ» ¿­°í °°Àº ID·Î Ãß°¡¸¸ ÇÏ¸é µÈ´Ù. ´ÜÃàÅ°´Â Ctrl+MÀ¸·Î ÁöÁ¤ÇÑ´Ù. WTL ³»ºÎ¿¡ ¿¢¼¿·¯·¹ÀÌÅÍ¿¡ ´ëÇÑ Ã³¸® Äڵ尡 ÀÌ¹Ì ÀÛ¼ºµÇ¾î ÀÖÀ¸¹Ç·Î ¸®¼Ò½º¿¡ µî·Ï¸¸ ÇØ ³õÀ¸¸é ¿¢¼¿·¯·¹ÀÌÅÍ°¡ µ¿ÀÛÇÑ´Ù. ÀÌÁ¦ ¸Þ´º¸¦ ¼±ÅÃÇϳª ¿¢¼¿·¯·¹ÀÌÅ͸¦ ´©¸£³ª ¸Þ½ÃÁö ¹Ú½º°¡ Àß ¿­¸± °ÍÀÌ´Ù.

¸®¼Ò½º¿¡ ¸Þ´º Ç׸ñ Ãß°¡ÇÏ°í ±× Çڵ鷯¸¦ ¸¸µå´Â ½Ç½ÀÀ» ÇØ º¸¾Ò´Âµ¥ MFC¿Í ¿ÏÀüÈ÷ °°Àº ¹æ¹ýÀ» »ç¿ëÇϹǷΠ¾ÆÁÖ ½±´Ù°í ´À³¥ °ÍÀÌ´Ù. ±×·¯³ª WTLÀº ±¸Á¶ÀûÀ¸·Î MFC¿Í ´Ù¸¥ ºÎºÐÀÌ Àִµ¥ ¸Þ´º¿¡ ´ëÇÑ ¼±Åà 󸮴 ¹Ýµå½Ã ¸ÞÀÎ ÇÁ·¹ÀÓÀÌ ÇØ¾ß ÇÑ´Ù´Â Á¡ÀÌ´Ù. ¸Þ´º ¸í·ÉÀÌ ºä¿Í °ü·ÃµÈ ¸í·ÉÀÏÁö¶óµµ ¸Þ´ºÀÇ Çڵ鷯¸¦ ºä¿¡ ÀÛ¼ºÇÒ ¼ö´Â ¾ø´Ù.

MFC¿¡ Àͼ÷ÇÑ »ç¶÷¿¡°Ô´Â ´çȲ½º·¯¿î Á¦¾àÀ̶ó°í ´À²¸ÁúÅÙµ¥ ¸Þ´º´Â ¸ÞÀÎ À©µµ¿ì¿¡ ¼Ò¼ÓµÇ¹Ç·Î ¸ÞÀÎ À©µµ¿ì°¡ ¸Þ´º¸¦ ó¸®ÇÏ´Â °ÍÀÌ ¿øÄ¢ÀûÀ̸ç ÀÚ¿¬½º·¯¿î °ÍÀÌ´Ù. Win32¿¡¼­µµ ¸Þ´º ¼±Åÿ¡ ´ëÇÑ ¸Þ½ÃÁö¸¦ Â÷Àϵ尡 ¹Þ´Â ¹ýÀº ¾øÀ¸¸ç Â÷Àϵå·Î WM_COMMAND°¡ ³¯¶ó°¡Áö´Â ¾Ê´Â´Ù. ±×·¯¹Ç·Î WTLµµ ´ç¿¬È÷ Win32¿Í ¸¶Âù°¡Áö Á¦¾àÀÌ »ý±â´Â °ÍÀÌ´Ù.

±×·¸´Ù¸é MFCÀÇ °æ¿ì´Â ¾î¶³±î? MFC ÇÁ·¹ÀÓ¿öÅ©¿¡´Â À̺¥Æ® ¶ó¿ìÆÃÀ̶ó´Â ¾Ë°í¸®ÁòÀÌ À־ ºä, µµÅ¥¸àÆ®, ÇÁ·¹ÀÓ, ÀÀ¿ë ÇÁ·Î±×·¥ ¼øÀ¸·Î ¸Þ½ÃÁö¸¦ Â÷·Ê´ë·Î º¸³»µµ·Ï µÇ¾î ÀÖÀ¸¸ç ÀÌ Áß ¸Þ½ÃÁö¸¦ ¸ÕÀú º¸´Â ÂÊÀÌ Ã³¸®Çϵµ·Ï µÇ¾î ÀÖ´Ù. ±×·¡¼­ ´©±¸µçÁö ÀڽŰú °ü·ÃµÈ ¸í·ÉÀ» ó¸®ÇÒ ¼ö ÀÖ´Â °ÍÀÌ´Ù. ÀÌ·± ¸éÀ» º¸¸é ¿ª½Ã MFC´Â °í¼öÁØ ¶óÀ̺귯¸®À̸ç È®½ÇÈ÷ µ·¹Þ°í ÆȾƸÔÀ»¸¸ÇÑ Á¦Ç°ÀÎ °ÍÀÌ´Ù.

WTLÀº °øÂ¥Àε¥´Ù ÀÛ°í °¡º­¿òÀ» Ç¥¹æÇÏ´Â ¶óÀ̺귯¸®À̹ǷΠÀÌ·± ¼¶¼¼ÇÑ ¾Ë°í¸®ÁòÀÌ ³»ÀåµÇ¾î ÀÖÁö ¾Ê´Ù. Á¤ ºä¿¡¼­ ó¸®ÇÏ·Á¸é ÀÏ´Ü ¸ÞÀÎ ÇÁ·¹ÀÓÀÌ ¹ÞÀº ÈÄ ºä¿¡°Ô ³Ñ°Ü ÁÖ¾î¾ß Çϴµ¥ Çڵ鷯¸¦ ÀÌÁßÀ¸·Î ÀÛ¼ºÇØ¾ß ÇϹǷΠºÒÆíÇÏ´Ù. Áï, À̺¥Æ® ¶ó¿ìÆÃÀÌ ¼öµ¿À̶ó´Â ¾ê±â´Ù. MFCÀÇ À̺¥Æ® ¶ó¿ìÆÃÀÌ ¾Æ½¬¿î ´ë¸ñÀÌ´Ù.

¶ó.UI »óÅ °ü¸®

ÀÀ¿ë ÇÁ·Î±×·¥ÀÌ Á¦°øÇÏ´Â UIµéÀº ÇöÀç »óÅ¿¡ µû¶ó »ç¿ëÇÒ ¼ö ÀÖ´Â ¸í·ÉÀÇ Á¾·ù°¡ ´Þ¶óÁö°í ¼±Åà »óŵµ ¼ö½Ã·Î º¯ÇÑ´Ù. WTLÀº ¸Þ´º, ¸Þ´º Ç׸ñ, Åø¹Ù, »óŶõ, Â÷Àϵå À©µµ¿ì µî ´Ù¼¸ °¡Áö UI¿¡ ´ëÇÑ »óŸ¦ °ü¸®ÇÑ´Ù. WTLÀÇ UI »óÅ °ü¸®´Â ¿©·¯ °¡Áö ¿ä¼ÒµéÀÌ °³ÀÔÇÏ¿© Çùµ¿ÀûÀ¸·Î µ¿ÀÛÇÑ´Ù. ¸ÞÀÓ ÇÁ·¹ÀÓ ¼±¾ð¹®À» º¸¸é CUpdateUI ¹Í½ºÀΠŬ·¡½º·ÎºÎÅÍ »ó¼ÓÀ» ¹Þ´Âµ¥ ÀÌ Å¬·¡½º°¡ UI °ü¸®¸¦ ÇÏ´Â ÁÖüÀÌ´Ù.

CUpdateUI Ŭ·¡½º¾È¿¡ UIÀÇ »óŸ¦ º¯°æÇÏ´Â ¿©·¯ °¡Áö ¸â¹ö ÇÔ¼öµéÀÌ Æ÷ÇԵǾî ÀÖ´Ù. ¸Þ´º³ª Â÷Àϵå ÄÁÆ®·ÑÀÇ UI¸¦ º¯°æÇÒ ¶§´Â ÀÌ ÇÔ¼öµéÀ» È£ÃâÇÏ¸é µÈ´Ù. ¸ÞÀÎ À©µµ¿ì »ó´Ü¿¡ ºÎÂøµÇ¾î ÀÖ´Â Åø¹Ù´Â Ç×»ó º¸À̹ǷΠUI¸¦ °ü¸®ÇÒ Æ¯º°ÇÑ ½ÃÁ¡ÀÌ µû·Î ¾ø´Ù. ±×·¡¼­ ¾ÆÀ̵é ŸÀÓ¿¡ Æ´Æ´ÀÌ »óŸ¦ °ü¸®Çϴµ¥ CIdleHandler°¡ ¸Þ½ÃÁö ·çÇÁÀÇ Àû´çÇÑ ¶§¿¡ OnIdle ÇÔ¼ö¸¦ ºÎ¸£°í ÀÌ ÇÔ¼ö¿¡¼­ Åø¹Ù¸¦ °ü¸®ÇÑ´Ù.

 

¿¹ Á¦ : UIUpdate

³»ºÎ µ¿ÀÛÀº ¸ÅÅ©·Î¸¦ ¼Ò½º¸¦ µé¿©´Ù º¸¸é ¾î·ÆÁö ¾Ê°Ô ºÐ¼®ÇÒ ¼ö ÀÖ´Ù. °£´ÜÇÑ ÀÎÅÍ³Ý ¿µÈ­ »ó¿µ ÇÁ·Î±×·¥À» ¸¸µé¾î º¸ÀÚ. ÆÄÀÏ ¸Þ´º ¾Õ¿¡ »õ Æ˾÷ ¸Þ´º¸¦ ¸¸µé°í ±×¸²°ú °°ÀÌ µðÀÚÀÎÇÑ´Ù.

WTL ¸¶¹ý»ç°¡ ¸¸µå´Â ¸®¼Ò½º´Â µðÆúÆ®·Î ¿µ¾î·Î ¼³Á¤µÇ¾î ÀÖÀ¸¹Ç·Î ¸®¼Ò½ºÀÇ ¾ð¾î ¼³Á¤À» Çѱ¹¾î·Î ¹Ù²ã¾ß ÇѱÛÀ» ¾µ ¼ö ÀÖ´Ù. ¸Þ´º Ç׸ñÀÇ ID´Â °¢°¢ ID_CONNECT, ID_MOVIE·Î ÁØ´Ù. ÀÎÅÍ³Ý ¿¬°á »óŸ¦ ÀúÀåÇϱâ À§ÇÑ ¸â¹ö º¯¼ö¸¦ ¸ÞÀÎ ÇÁ·¹ÀÓ¿¡ ¼±¾ðÇÑ´Ù.

 

class CMainFrame : public CFrameWindowImpl<CMainFrame>, public CUpdateUI<CMainFrame>,

          public CMessageFilter, public CIdleHandler

{

public:

     DECLARE_FRAME_WND_CLASS(NULL, IDR_MAINFRAME)

     bool m_Connect;

 

ÃÖÃÊ Á¢¼ÓµÇÁö ¾ÊÀº »óÅ·Π½ÃÀÛÇϹǷΠOnCreate¿¡¼­ false·Î ÃʱâÈ­ÇÑ´Ù.

 

LRESULT CMainFrame::OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)

{

     ....

     m_Connect=false;

 

     return 0;

}

 

µÎ ¸Þ´º Ç׸ñ¿¡ ´ëÇÑ Çڵ鷯¸¦ ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÑ´Ù. ÁøÂ¥ Á¢¼ÓÀ̳ª ¿µÈ­ »ó¿µÀ» ÇÏÁö´Â ¾Ê°í ¸Þ½ÃÁö ¹Ú½º·Î Èä³»¸¸ ³½´Ù.

 

LRESULT CMainFrame::OnConnect(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)

{

     m_Connect=!m_Connect;

     if (m_Connect == true) {

          MessageBox(_T("ÀÎÅÍ³Ý ¿¬°áµÇ¾ú½À´Ï´Ù."),_T("¾Ë¸²"));

     } else {

          MessageBox(_T("ÀÎÅÍ³Ý Á¢¼ÓÀÌ ÇØÁ¦µÇ¾ú½À´Ï´Ù."),_T("¾Ë¸²"));

     }

 

     return 0;

}

 

LRESULT CMainFrame::OnMovie(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)

{

     MessageBox(_T("Áö±ÝºÎÅÍ ¿µÈ­¸¦ »ó¿µÇÏ°Ú½À´Ï´Ù."),_T("¾Ë¸²"));

 

     return 0;

}

 

µ¿ÀÛÀº ÇÏÁö¸¸ ¹º°¡ ½Ì°Ì´Ù. ¿¬°áµÇ¾ú´Ù´Â °ÍÀ» ¸Þ´º¿¡ Ç¥½ÃÇÏÁöµµ ¾Ê°í ¿¬°áµµ µÇÁö ¾ÊÀº ä·Î ¿µÈ­¸¦ º¼ ¼ö ÀÖÀ¸´Ï ¸»ÀÌ´Ù. »óÅ º¯È­¿¡ µû¶ó ¸Þ´º Ç׸ñÀ» ÀûÀýÈ÷ °ü¸®ÇØ¾ß ÇÑ´Ù. ¸ÞÀÎ ÇÁ·¹ÀÓÀÇ Çì´õ ÆÄÀÏ¿¡ UI ¸ÊÀ» ÀÛ¼ºÇÑ´Ù.

 

BEGIN_UPDATE_UI_MAP(CMainFrame)

     UPDATE_ELEMENT(ID_VIEW_TOOLBAR, UPDUI_MENUPOPUP)

     UPDATE_ELEMENT(ID_VIEW_STATUS_BAR, UPDUI_MENUPOPUP)

     UPDATE_ELEMENT(ID_CONNECT, UPDUI_MENUPOPUP)

     UPDATE_ELEMENT(ID_MOVIE, UPDUI_MENUPOPUP)

END_UPDATE_UI_MAP()

 

UI ¸ÊÀÇ ¿£Æ®¸®¿¡¼­ °ü¸® ´ë»ó Ç׸ñÀÇ ID¿Í Á¾·ù¸¦ ÁöÁ¤ÇÑ´Ù. ¸¶¹ý»ç¿¡ ÀÇÇØ ÀÌ¹Ì µÎ°³ÀÇ UI ¸ÊÀÌ ÀÛ¼ºµÇ¾î ÀÖÀ¸¸ç ÀÌ µÑÀº ÀÌ¹Ì Àß µ¿ÀÛÇÑ´Ù. UI¸ÊÀ» ÀÛ¼ºÇÑ ÈÄ ÇÊ¿äÇÒ ¶§¸¶´Ù CUpdateUIÀÇ ¸â¹ö ÇÔ¼ö¸¦ È£ÃâÇÏ¿© UIÀÇ »óŸ¦ °ü¸®ÇÑ´Ù.

 

BOOL UIEnable(int nID, BOOL bEnable, BOOL bForceUpdate = FALSE)

BOOL UISetCheck(int nID, int nCheck, BOOL bForceUpdate = FALSE)

BOOL UISetRadio(int nID, BOOL bRadio, BOOL bForceUpdate = FALSE)

BOOL UISetText(int nID, LPCTSTR lpstrText, BOOL bForceUpdate = FALSE)

BOOL UISetState(int nID, DWORD dwState)

DWORD UIGetState(int nID)

 

¿øÇüÀ» º¸ÀÌ´Â ÀÌ»ó ´õ ¹«½¼ ÀܼҸ®°¡ ÇÊ¿äÇϰڴ°¡. ¸ÞÀÎ ÇÁ·¹ÀÓÀº CUpdateUIÀÇ ÆÄ»ý Ŭ·¡½ºÀ̹ǷΠº°´Ù¸¥ Áغñ¸¦ ÇÒ ÇÊ¿ä¾øÀÌ ±×³É ÇÔ¼ö¸¦ È£ÃâÇÏ¸é µÈ´Ù. ÀÌ ¿¹Á¦ÀÇ °æ¿ì ÀÎÅÍ³Ý ¿¬°á ½ÃÁ¡¿¡¼­ ¸Þ´º Ç׸ñÀ» °ü¸®ÇÑ´Ù.

 

LRESULT CMainFrame::OnConnect(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)

{

     m_Connect=!m_Connect;

     if (m_Connect == true) {

          MessageBox(_T("ÀÎÅÍ³Ý ¿¬°áµÇ¾ú½À´Ï´Ù."),_T("¾Ë¸²"));

     } else {

          MessageBox(_T("ÀÎÅÍ³Ý Á¢¼ÓÀÌ ÇØÁ¦µÇ¾ú½À´Ï´Ù."),_T("¾Ë¸²"));

     }

 

     UISetCheck(ID_CONNECT, m_Connect);

     UIEnable(ID_MOVIE, m_Connect);

 

     return 0;

}

 

¿¬°áµÇ¸é ÀÎÅÍ³Ý ¿¬°á Ç׸ñ¿¡ üũ Ç¥½Ã¸¦ ºÙÀÌ°í ¿µÈ­ º¸±â Ç׸ñÀ» ¼±ÅÃÇÒ ¼ö ÀÖ´Ù. ¿µÈ­ º¸±â´Â Ãʱ⿡ »ç¿ë ±ÝÁö »óÅ¿©¾ß ÇϹǷΠOnCreate¿¡¼­µµ °ü¸®°¡ ÇÊ¿äÇÏ´Ù.

 

LRESULT CMainFrame::OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)

{

     ....

     m_Connect=false;

     UIEnable(ID_MOVIE, m_Connect);

 

     return 0;

}

 

ÀÌÁ¦ ½ÇÇàÇØ º¸¸é ÇÁ·Î±×·¥ÀÇ »óÅ¿¡ µû¶ó ¸Þ´º Ç׸ñÀÌ °ü¸®µÉ °ÍÀÌ´Ù. ÃÖÃÊ ¿µÈ­ º¸±â Ç׸ñÀÌ »ç¿ë ±ÝÁöµÇ¾î ÀÖÀ¸¸ç ¿¬°áÀ» ¼±ÅÃÇϸé üũ Ç¥½Ã°¡ ³ªÅ¸³ª ¿¬°á »óŸ¦ º¸¿©ÁÖ°í ¿µÈ­ º¸±â ¸í·Éµµ »ç¿ëÇÒ ¼ö ÀÖ´Ù.

 

ÀüÇüÀûÀÎ UIÀÎ ¸Þ´º Ç׸ñ¿¡ ´ëÇؼ­¸¸ ¿¹Á¦¸¦ ¸¸µé¾î º¸¾Ò´Âµ¥ Åø¹Ù³ª »óŶõ, Â÷Àϵå ÄÁÆ®·ÑÀ» °ü¸®ÇÏ´Â ¹æ¹ýµµ À¯»çÇÏ´Ù.