< ¸Þ¼¼Áö ¸®Ç÷º¼Ç >

Åë»ó
ÄÁÆ®·ÑÀº WM_COMMAND(ÄÚ¸Õ ÄÁÆ®·ÑÀÇ °æ¿ì´ÂWM_NOTIFY) ¸Þ¼¼Áö¸¦ ºÎ¸ð À©µµ¿ì¿¡ ¼Û½ÅÇÕ´Ï´Ù. ºÎ¸ð À©µµ¿ì´Â ±×·¯ÇÑ ¸Þ¼¼Áö¿¡ ÀÀ´äÇØ 󸮸¦ ½ÇÇàÇÕ´Ï´Ù.

¡¡
±×·¯³ª ÄÁÆ®·ÑÀÌ º¸³»´Â ±×·¯ÇÑ ¸Þ¼¼Áö¸¦  ºÎ¸ð À©µµ¿ì´Â ¾Æ´Ï°í ±× ÄÁÆ®·Ñ Àڽſ¡°Ô ÀÀ´ä½ÃŰ°í ½ÍÀº °æ¿ì°¡ ÀÖ½À´Ï´Ù. ¸Þ¼¼Áö ¸®Ç÷º¼ÇÀº À̰ÍÀ» ½ÇÇöÇÏ´Â ±¸Á¶ÀÔ´Ï´Ù. ¸Þ¼¼Áö ¸®Ç÷º¼ÇÀ» »ç¿ëÇϸé ÄÁÆ®·ÑÀÌ ºÎ¸ð À©µµ¿ì¿¡ º¸³½ ¸Þ¼¼Áö´Â ºÎ¸ð À©µµ¿ì·ÎºÎÅÍ ÄÁÆ®·Ñ¿¡ ¹Ý¼ÛµÇ¾î ÄÁÆ®·ÑÀÌ ÀÀ´äÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù.

´ÙÀ½¿¡ ³ªÅ¸³»´Â °ÍÀº  ÄÁÆ®·Ñ·ÎºÎÅÍÀÇ ¸Þ¼¼Áö¸¦ ¹Ý¼ÛÇÏ´Â ºÎ¸ð À©µµ¿ì Ŭ·¡½ºÀÇ ¸Þ¼¼Áö ¸ÊÀÔ´Ï´Ù.

// ºÎ¸ð À©µµ¿ì

class CMainDlg : public CDialogImpl<CMainDlg>

{

    ...

    ...

 

    // ¸Þ¼¼Áö ¸Ê

    BEGIN_MSG_MAP_EX(CMainDlg)

        MSG_WM_INITDIALOG(OnInitDialog)

        ...

        ...

        REFLECT_NOTIFICATIONS()  // 󸮵ÇÁö ¾Ê¾Ò´ø ÄÁÆ®·Ñ·ÎºÎÅÍÀÇ ¸Þ¼¼Áö¸¦ ¹Ý¼Û

    END_MSG_MAP()

 

    ...

    ...

                      


¡¡
ºÎ¸ð À©µµ¿ì(ÀÌ ¿¹¿¡¼­´ÂCMainDlg)´Â ÄÁÆ®·Ñ·ÎºÎÅÍÀÇ ¸Þ¼¼Áö¸¦ ¹Þ¾ÆµéÀÌ¸é  ¸Þ¼¼Áö ¸Ê¿¡ ±× ¸Þ½ÃÁö ¿ëÀÇ ¸Þ¼¼Áö ¸Ê ¿£Æ®¸®°¡ ÀÖ´ÂÁö ¾î¶²Áö Á¶»çÇÕ´Ï´Ù. ÇØ´çÇÏ´Â ¸Þ¼¼Áö ¸Ê ¿£Æ®¸®°¡ ¾øÀ¸¸é , REFLECT_NOTIFICATIONS ¸ÅÅ©·Î¿¡ ÀÇÇØ ¸Þ¼¼Áö¸¦ º¸³» ¿Â ÄÁÆ®·Ñ¿¡ ¹Ý¼ÛÇÕ´Ï´Ù.

¡¡
´ÙÀ½¿¡ ¹Ý¼ÛµÈ ¸Þ¼¼Áö¿¡ ÀÀ´äÇÏ´Â ÄÁÆ®·Ñ Ŭ·¡½º¸¦ Á¤ÀÇÇÕ´Ï´Ù. ¿©±â¿¡¼­´Â ¹öư¿ë Ŭ·¡½ºCUrlButton¸¦ Á¤ÀÇÇÕ´Ï´Ù.  CUrlButtonŬ·¡½º´Â ¹öưÀÇ Ä¸¼Ç ij¸¯ÅÍ ¶óÀÎÀ» URLÀ̶ó°í °¡Á¤ÇØ ¹öưÀ» ´©¸£¸é ±× URL¸¦ ¿±´Ï´Ù. ÀÌ ¿¹¿¡¼­´Â UrlButton.hÀ̶ó°í ÇÏ´Â Çì´õ ÆÄÀÏÀ» ÁغñÇØ °Å±â¿¡ CUrlButtonŬ·¡½º¸¦ Á¤ÀÇÇϰí ÀÖ½À´Ï´Ù.

// UrlButton.h

class CUrlButton : public CWindowImpl<CUrlButton>

{

public:

    DECLARE_WND_SUPERCLASS(_T("UrlButton"), _T("BUTTON"))

 

    // ¸Þ¼¼Áö ¸Ê

    BEGIN_MSG_MAP_EX(CUrlButton)

        MSG_OCM_COMMAND(OnCommand)

        DEFAULT_REFLECTION_HANDLER()

    END_MSG_MAP()

 

    void OnCommand(UINT uNotifyCode, int nID, HWND hWndCtl){

        TCHAR szURL[2048];

        GetWindowText(szURL, sizeof(szURL)/sizeof(TCHAR));

        ShellExecute(m_hWnd, _T("open"), szURL, NULL, NULL, SW_SHOWNORMAL);

    }

}

                      


À̰Ϳ¡ ÀÇÇØ ºÎ¸ð À©µµ¿ì·ÎºÎÅÍ ¹Ý¼ÛµÈ ¸Þ¼¼Áö´Â ¸Þ¼¼Áö¸¦ º¸³½ ÄÁÆ®·ÑÀÇ ¸Þ¼¼Áö ¸ÊÀ¸·Î 󸮵˴ϴÙ. ¹Ý¼ÛµÈ ¸Þ½ÃÁö´Â OCM_À¸·Î ½ÃÀ۵˴ϴÙ. (OCM_COMMAND³ªOCM_NOTIFY³ªOCM_CTLCOLORBTNµî. )  WTL´Â ¹Ý¼ÛµÈ ¸Þ¼¼Áö¸¦ À§ÇÑ ¸Þ¼¼Áö ¸ÅÅ©·Î¸¦ ÁغñÇØ ÀÖ½À´Ï´Ù. À§ÀÇ ¿¹¿¡¼­´ÂOCM_COMMAND ¸Þ½ÃÁö¸¦ MSG_OCM_COMMAND ¸Þ¼¼Áö ¸ÅÅ©·Î¿¡ ÀÇÇØ  OnCommand()¿¡ ¸ÅÇÎ Çϰí ÀÖ½À´Ï´Ù. µ¡ºÙ¿© 󸮵ÇÁö ¾Ê¾Ò´ø ¸Þ½ÃÁö´Â DEFAULT_REFLECTION_HANDLER ¸ÅÅ©·Î¿¡ ÀÇÇØ 󸮵˴ϴÙ.

¸¶Áö¸·À¸·Î ÄÁÆ®·ÑÀ» ÀÛ¼ºÇÒ Çʿ䰡 ÀÖ½À´Ï´Ù. ÀÛ¼ºÇϱâ À§Çؼ­´ÂCreate()À» È£ÃâÇÕ´Ï´Ù¸¸  SubclassWindow()¿¡ ÀÇÇØ ±âÁ¸ÀÇ ÄÁÆ®·ÑÀ» ¼­ºê Ŭ·¡½ºÈ­ÇÒ ¼öµµ ÀÖ½À´Ï´Ù.

class CMainDlg : public CDialogImpl<CMainDlg>

{

    ...

    ...

 

    enum { IDC_BUTTON_URL = 1001 };

    CUrlButton m_button_url;

 

    LRESULT OnInitDialog(HWND hWnd, LPARAM lParam){

 

        // ÄÁÆ®·Ñ ÀÛ¼º

        m_button_url.Create(m_hWnd, CRect(0, 0, 200, 30),

            _T("http://www.google.com/"), WS_CHILD | WS_VISIBLE, 0, IDC_BUTTON_URL);

        // ¶Ç´Â ±âÁ¸ÀÇ ÄÁÆ®·ÑÀ» ¼­ºê Ŭ·¡½ºÈ­

        // m_button_url.SubclassWindow(GetDlgItem(IDC_BUTTON_URL));

 

        return TRUE;

    }

 

    ...

    ...

                      


ÀÌ¿Í °°ÀÌ ¸Þ¼¼Áö ¸®Ç÷º¼ÇÀ» »ç¿ëÇϸé ÄÁÆ®·Ñ Ŭ·¡½º°¡ ºÎ¸ð À©µµ¿ì¿¡ ÀÇÁ¸ÇÏÁö ¾Ê°í  ÀÚ½ÅÀÌ ºÎ¸ð À©µµ¿ì¿¡ º¸³½ ¸Þ¼¼Áö¿¡ ´ëÇÑ µ¿ÀÛÀ» ÀÚ±â ÀÚ½ÅÀ¸·Î ±¸Çö ÇÒ ¼ö ÀÖ½À´Ï´Ù.

¡¡
´ÙÀ½¿¡ ³ªÅ¸³»´Â °ÍÀº CUrlButtonŬ·¡½º¸¦ »ç¿ëÇÏ´Â ¿¹ÀÔ´Ï´Ù.

 

// stdafx.h

#include <atlbase.h>

#include <atlapp.h>

extern CAppModule _Module;

#include <atlwin.h>

 

#include <atlcrack.h>

#include <atlmisc.h>

                      

 

// maindlg.h³»

class CMainDlg : public CDialogImpl<CMainDlg>

{

public:

    enum { IDD = IDD_MAINDLG };

 

    CUrlButton m_button_url;

 

    // ¸Þ¼¼Áö ¸Ê

    BEGIN_MSG_MAP_EX(CMainDlg)

        MSG_WM_INITDIALOG(OnInitDialog)

        COMMAND_ID_HANDLER_EX(IDOK, OnOK)

        COMMAND_ID_HANDLER_EX(IDCANCEL, OnCancel)

        REFLECT_NOTIFICATIONS()  // ¸Þ¼¼Áö¸¦ ¹Ý¼Û

    END_MSG_MAP()

 

    LRESULT OnInitDialog(HWND hWnd, LPARAM lParam){

        // ½ºÅ©¸°ÀÇ Áß¾Ó¿¡ ¹èÄ¡

        CenterWindow();

 

        // Å« ¾ÆÀÌÄÜ ¼³Á¤

        HICON hIcon = AtlLoadIconImage(IDR_MAINFRAME, LR_DEFAULTCOLOR,

            ::GetSystemMetrics(SM_CXICON), ::GetSystemMetrics(SM_CYICON));

        SetIcon(hIcon, TRUE);

       

        // ÀÛÀº ¾ÆÀÌÄÜ ¼³Á¤

        HICON hIconSmall = AtlLoadIconImage(IDR_MAINFRAME, LR_DEFAULTCOLOR,

            ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON));

        SetIcon(hIconSmall, FALSE);

 

        // ÄÁÆ®·Ñ ¼­ºê Ŭ·¡½ºÈ­

        m_button_url.SubclassWindow(GetDlgItem(IDC_BUTTON_URL));

 

        return TRUE;

    }

 

    void OnOK(UINT uNotifyCode, int nID, HWND hWndCtl){

        EndDialog(nID);

    }

 

    void OnCancel(UINT uNotifyCode, int nID, HWND hWndCtl){

        EndDialog(nID);

    }

};

                      

 

// Control.cpp

#include "stdafx.h"

 

#include "resource.h"

 

#include "UrlButton.h"

#include "maindlg.h"

 

CAppModule _Module;

 

int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE, LPTSTR lpCmdLine, int nCmdShow)

{

    HRESULT hRes = ::CoInitialize(NULL);

    ATLASSERT(SUCCEEDED(hRes));

 

    ::DefWindowProc(NULL, 0, 0, 0L);

 

    AtlInitCommonControls(ICC_COOL_CLASSES | ICC_WIN95_CLASSES);

 

    hRes = _Module.Init(NULL, hInstance);

    ATLASSERT(SUCCEEDED(hRes));

 

    int nRet = 0;

    // BLOCK: ¾îÇø®ÄÉÀÌ¼Ç ½ÇÇà

    {

        CMainDlg dlgMain;

        nRet = dlgMain.DoModal();

    }

 

    _Module.Term();

    ::CoUninitialize();

 

    return nRet;

}

                      


¡¡
¿ì¼± ¸®¼Ò½º¸¦ ÀÛ¼ºÇÕ´Ï´Ù. ´ÙÀ̾ó·Î±×¿¡ ¹öư ÄÁÆ®·ÑÀ» ¹èÄ¡ÇÏ°í  ¸®¼Ò¼ö ID¸¦ ´ÙÀ½°ú °°ÀÌ ÁöÁ¤ÇÕ´Ï´Ù. µ¡ºÙ¿© ¹öưÀÇ Ä¸¼ÇÀº À¯È¿ÇÑURLij¸¯ÅÍ ¶óÀÎÀ¸·Î ¼³Á¤ÇÕ´Ï´Ù.

ÄÁÆ®·Ñ¸í

¸®¼Ò½º ID

Ǫ½¬ ¹öư

IDC_BUTTON_URL


¡¡
´ÙÀ½¿¡ CMainDlg Ŭ·¡½º¿¡¼­ URL¹öư¿ëÀ¸·Î CUrlButton Ŭ·¡½ºÀÇ ÀνºÅϽº¸¦ ¸â¹ö º¯¼ö·Î¼­ ¼±¾ðÇÕ´Ï´Ù.

¡¡
´ÙÀ½¿¡  ¸Þ¼¼Áö ¸ÊÀ¸·Î REFLECT_NOTIFICATIONS¸¦ Ãß°¡ÇØ  ¸¶Áö¸·¿¡ WM_INITDIALOG ¸Þ¼¼Áö Çڵ鷯·Î SubclassWindow()¿¡ ÀÇÇØ ±âÁ¸ÀÇ ¹öư ÄÁÆ®·ÑÀ» ¼­ºê Ŭ·¡½ºÈ­ÇÕ´Ï´Ù.

¡¡
±×·±µ¥ À̹øÀº ¹Ý¼ÛµÈ ¸Þ¼¼ÁöÀÇ ¸ÅÇο¡ MSG_OCM_COMMAND ¸Þ¼¼Áö ¸ÅÅ©·Î¸¦ »ç¿ëÇß½À´Ï´Ù¸¸  WTLÀº ¹Ý¼ÛµÈ ¸Þ½ÃÁö¿ë À¸·Î ´ÙÀ½°ú °°Àº Á¾·ùÀÇ ¸Þ¼¼Áö ¸ÅÅ©·Î¸¦ ÁغñÇØ ÀÖ½À´Ï´Ù.



¸Þ¼¼Áö ¸®Ç÷º¼Ç¿ë Ä¿¸àµå Çڵ鷯 ¸ÅÅ©·Î

¡¡´ÙÀ½ÀÇ ¸Þ¼¼Áö ¸ÅÅ©·Î´Â , ¹Ý¼ÛµÈ Ä¿¸àµå ¸Þ¼¼Áö(OCM_COMMAND) À» ´ë»óÀ¸·Î ÇÕ´Ï´Ù.

  • MSG_OCM_COMMAND(Çڵ鷯¸í)

¹Ý¼ÛµÈ Ä¿¸àµå ¸Þ¼¼Áö¸¦ Çڵ鷯 ÇÔ¼ö¿¡ ¸Ê ÇÕ´Ï´Ù.

 

  • REFLECTED_COMMAND_HANDLER_EX(ID, ÅëÁö ÄÚµå, Çڵ鷯¸í)

ÁöÁ¤µÈ ÄÁÆ®·Ñ·ÎºÎÅÍÀÇ ÁöÁ¤µÈ ÅëÁö Äڵ带 °¡Áö´Â ¹Ý¼ÛµÈ Ä¿¸àµå ¸Þ¼¼Áö¸¦ Çڵ鷯 ÇÔ¼ö¿¡ ¸Ê ÇÕ´Ï´Ù.

 

  • REFLECTED_COMMAND_ID_HANDLER_EX(ID, Çڵ鷯¸í)

ÁöÁ¤µÈ ÄÁÆ®·Ñ·ÎºÎÅÍÀÇ ÀÓÀÇÀÇ ÅëÁö Äڵ带 °¡Áö´Â ¹Ý¼ÛµÈ Ä¿¸àµå ¸Þ¼¼Áö¸¦ Çڵ鷯 ÇÔ¼ö¿¡ ¸Ê ÇÕ´Ï´Ù.

 

  • REFLECTED_COMMAND_CODE_HANDLER_EX(ÅëÁö ÄÚµå, Çڵ鷯¸í)

ÀÓÀÇÀÇ ÄÁÆ®·Ñ·ÎºÎÅÍÀÇ ÁöÁ¤µÈ ÅëÁö Äڵ带 °¡Áö´Â ¹Ý¼ÛµÈ Ä¿¸àµå ¸Þ¼¼Áö¸¦ Çڵ鷯 ÇÔ¼ö¿¡ ¸Ê ÇÕ´Ï´Ù.

 

  • REFLECTED_COMMAND_RANGE_HANDLER_EX(°³½Ã À§Ä¡ÀÇ ¸Þ¼¼Áö¸í, Á¾·á À§Ä¡ÀÇ ¸Þ¼¼Áö¸í, Çڵ鷯¸í)

¿¬¼ÓÇÑ ¹üÀ§ÀÇ ÄÁÆ®·Ñ·ÎºÎÅÍÀÇ ¹Ý¼ÛµÈ Ä¿¸àµå ¸Þ¼¼Áö¸¦ Çڵ鷯 ÇÔ¼ö¿¡ ¸Ê ÇÕ´Ï´Ù.

 

  • REFLECTED_COMMAND_RANGE_CODE_HANDLER_EX(°³½Ã À§Ä¡ÀÇ ¸Þ¼¼Áö¸í, Á¾·á À§Ä¡ÀÇ ¸Þ¼¼Áö¸í, ÅëÁö ÄÚµå, Çڵ鷯¸í)

¿¬¼ÓÇÑ ¹üÀ§ÀÇ ÄÁÆ®·Ñ·ÎºÎÅÍÀÇ ÁöÁ¤µÈ ÅëÁö Äڵ带 °¡Áö´Â ¹Ý¼ÛµÈ Ä¿¸àµå ¸Þ¼¼Áö¸¦ Çڵ鷯 ÇÔ¼ö¿¡ ¸Ê ÇÕ´Ï´Ù.



¸Þ¼¼Áö ¸®Ç÷º¼Ç¿ë ÅëÁö Çڵ鷯 ¸ÅÅ©·Î

¡¡´ÙÀ½ÀÇ ¸Þ¼¼Áö ¸ÅÅ©·Î´Â , ¹Ý¼ÛµÈ ÅëÁö ¸Þ¼¼Áö(OCM_NOTIFY) ¸¦ ´ë»óÀ¸·Î ÇÕ´Ï´Ù.

  • MSG_OCM_NOTIFY(Çڵ鷯¸í)

¹Ý¼ÛµÈ ÅëÁö ¸Þ¼¼Áö¸¦ Çڵ鷯 ÇÔ¼ö¿¡ ¸Ê ÇÕ´Ï´Ù.

 

  • REFLECTED_NOTIFY_HANDLER_EX(ID, ÅëÁö ÄÚµå, Çڵ鷯¸í)

ÁöÁ¤µÈ ÄÁÆ®·Ñ·ÎºÎÅÍÀÇ ÁöÁ¤µÈ ÅëÁö Äڵ带 °¡Áö´Â ¹Ý¼ÛµÈ ÅëÁö ¸Þ¼¼Áö¸¦ Çڵ鷯 ÇÔ¼ö¿¡ ¸Ê ÇÕ´Ï´Ù.

 

  • REFLECTED_NOTIFY_ID_HANDLER_EX(ID, Çڵ鷯¸í)

ÁöÁ¤µÈ ÄÁÆ®·Ñ·ÎºÎÅÍÀÇ ÀÓÀÇÀÇ ÅëÁö Äڵ带 °¡Áö´Â ¹Ý¼ÛµÈ ÅëÁö ¸Þ¼¼Áö¸¦ Çڵ鷯 ÇÔ¼ö¿¡ ¸Ê ÇÕ´Ï´Ù.

 

  • REFLECTED_NOTIFY_CODE_HANDLER_EX(ÅëÁö ÄÚµå, Çڵ鷯¸í)

ÀÓÀÇÀÇ ÄÁÆ®·Ñ·ÎºÎÅÍÀÇ ÁöÁ¤µÈ ÅëÁö Äڵ带 °¡Áö´Â ¹Ý¼ÛµÈ ÅëÁö ¸Þ¼¼Áö¸¦ Çڵ鷯 ÇÔ¼ö¿¡ ¸Ê ÇÕ´Ï´Ù.

 

  • REFLECTED_NOTIFY_RANGE_HANDLER_EX(°³½Ã À§Ä¡ÀÇ ¸Þ¼¼Áö¸í, Á¾·á À§Ä¡ÀÇ ¸Þ¼¼Áö¸í, Çڵ鷯¸í)

¿¬¼ÓÇÑ ¹üÀ§ÀÇ ÄÁÆ®·Ñ·ÎºÎÅÍÀÇ ¹Ý¼ÛµÈ ÅëÁö ¸Þ¼¼Áö¸¦ Çڵ鷯 ÇÔ¼ö¿¡ ¸Ê ÇÕ´Ï´Ù.

 

  • REFLECTED_NOTIFY_RANGE_CODE_HANDLER_EX(°³½Ã À§Ä¡ÀÇ ¸Þ¼¼Áö¸í, Á¾·á À§Ä¡ÀÇ ¸Þ¼¼Áö¸í, ÅëÁö ÄÚµå, Çڵ鷯¸í)

¿¬¼ÓÇÑ ¹üÀ§ÀÇ ÄÁÆ®·Ñ·ÎºÎÅÍÀÇ ÁöÁ¤µÈ ÅëÁö Äڵ带 °¡Áö´Â ¹Ý¼ÛµÈ ÅëÁö ¸Þ¼¼Áö¸¦ Çڵ鷯 ÇÔ¼ö¿¡ ¸Ê ÇÕ´Ï´Ù.



±× ¿ÜÀÇ ¸Þ¼¼Áö ¸®Ç÷º¼Ç¿ë Çڵ鷯 ¸ÅÅ©·Î

¡¡´ÙÀ½ÀÇ ¸Þ¼¼Áö ¸ÅÅ©·Î´Â , ¾Õ¿¡¼­ ¸»ÇÑ °Í ÀÌ¿ÜÀÇ ¸Þ¼¼Áö ¸®Ç÷º¼Ç¿ë ¸Þ¼¼Áö¸¦ ´ë»óÀ¸·Î ÇÕ´Ï´Ù.

  • MSG_OCM_PARENTNOTIFY(Çڵ鷯¸í)
  • MSG_OCM_DRAWITEM(Çڵ鷯¸í)
  • MSG_OCM_MEASUREITEM(Çڵ鷯¸í)
  • MSG_OCM_COMPAREITEM(Çڵ鷯¸í)
  • MSG_OCM_DELETEITEM(Çڵ鷯¸í)
  • MSG_OCM_VKEYTOITEM(Çڵ鷯¸í)
  • MSG_OCM_CHARTOITEM(Çڵ鷯¸í)
  • MSG_OCM_HSCROLL(Çڵ鷯¸í)
  • MSG_OCM_VSCROLL(Çڵ鷯¸í)
  • MSG_OCM_CTLCOLOREDIT(Çڵ鷯¸í)
  • MSG_OCM_CTLCOLORLISTBOX(Çڵ鷯¸í)
  • MSG_OCM_CTLCOLORBTN(Çڵ鷯¸í)
  • MSG_OCM_CTLCOLORDLG(Çڵ鷯¸í)
  • MSG_OCM_CTLCOLORSCROLLBAR(Çڵ鷯¸í)
  • MSG_OCM_CTLCOLORSTATIC(Çڵ鷯¸í)