< ContainedWindow >


ContainedWindow´Â ¹ÞÀº ¸ðµç ¸Þ¼¼Áö¸¦ ÀÚ½ÅÀÇ ÄÁÅ×ÀÌ³Ê À©µµ¿ì¿¡ °Ç³×ÁÝ´Ï´Ù. ÀϹÝÀûÀ¸·Î ÄÁÅ×ÀÌ³Ê À©µµ¿ì´Â ºÎ¸ð À©µµ¿ì À̹ǷΠContainedWindow´Â ±× ÀÚ½Ä À©µµ¿ì ÀÔ´Ï´Ù¸¸ ±×·¸Áö ¾ÊÀº °æ¿ìµµ ÀÖ½À´Ï´Ù.  ÄÁÅ×ÀÌ³Ê À©µµ¿ìÀÇ Å¬·¡½º´Â ContainedWindowÀÇ Å¬·¡½º¸¦ ¸â¹ö º¯¼ö·Î¼­ °¡Áý´Ï´Ù.

ContainedWindow´Â ÄÁÆ®·Ñ µîÀÇ Á¤Àǰ¡ ³¡³­ À©µµ¿ì Ŭ·¡½º ("BUTTON"³ª"SysListView32"µî ) ¸¦ ±âº»À¸·Î ÇÕ´Ï´Ù. ´ÙÀ½¿¡ ³ªÅ¸³»´Â °ÍÀº ´ÙÀ̾ó·Î±×¸¦ ÄÁÅ×À̳ʷΠÇßÀ» ¶§ÀÇ ¿¹ ÀÔ´Ï´Ù.

// ÄÁÅ×ÀÌ³Ê À©µµ¿ì

class CMainDlg : public CDialogImpl<CMainDlg>

{

public:

    enum { IDD = IDD_MAINDLG };

 

    CContainedWindow m_contained;  // ÄÜÅ× Àεµ À©µµ¿ì

 

    // constructor¡¡ ¡¡

    CMainDlg() : m_contained(_T("BUTTON"), this, 100)

    {}

 

    ...

    ...

                      


¡¡
¿ì¼± , ContainedWindowÀÇ ÀνºÅϽº¸¦ ÄÁÅ×ÀÌ³Ê À©µµ¿ì(ÀÌ ¿¹¿¡¼­´Â ´ÙÀ̾ó·Î±×) Ŭ·¡½ºÀÇ ¸â¹ö º¯¼ö·Î¼­ ¼±¾ðÇÕ´Ï´Ù. ±×¸®°í ÄÁÅ×ÀÌ³Ê À©µµ¿ìÀÇ constructor¡¡ ¡¡ À¸·Î ÃʱâÈ­ ÇÕ´Ï´Ù. Á¦1Àμö¿¡´Â Á¤Àǰ¡ ³¡³­ À©µµ¿ì Ŭ·¡½º ¸íÀ» Á¦2Àμö¿¡´Â ¸Þ¼¼Áö¸¦ ó¸®ÇÏ´Â À©µµ¿ì¿¡ÀÇ Æ÷ÀÎÅ͸¦ Á¦3Àμö¿¡´Â ¸Þ¼¼Áö¸¦ ó¸®ÇÏ´Â ´ëü ¸Þ¼¼Áö ¸ÊÀÇ ¹øÈ£¸¦ ÁöÁ¤ ÇÕ´Ï´Ù.

ÀÌ ¿¹ ¿¡¼­´Â  ¸Þ¼¼Áö¸¦ ó¸®ÇÏ´Â ´ëü ¸Þ¼¼Áö ¸ÊÀÇ ¹øÈ£¸¦ 100·Î ÁöÁ¤Çϰí ÀÖ½À´Ï´Ù.  µû¶ó¼­ CMainDlg Ŭ·¡½ºÀÇ  ¸Þ¼¼Áö ¸ÊÀº ´ÙÀ½°ú °°ÀÌ ÇÕ´Ï´Ù.

Class CMainDlg : public CDialogImpl<CMainDlg>

{

    ...

    ...

 

    // ¸Þ¼¼Áö ¸Ê

    BEGIN_MSG_MAP_EX(CMainDlg)

        MSG_WM_INITDIALOG(OnInitDialog)

        ...

        ...

    ALT_MSG_MAP(100)  // ContainedWindow¿ë ´ëü ¸Þ¼¼Áö ¸Ê

        MSG_WM_LBUTTONDOWN(OnLButtonDownForContained)

    END_MSG_MAP()

 

    void OnLButtonDownForContained(UINT uFlags, CPoint pt){

        MessageBeep(MB_ICONASTERISK);

        SetMsgHandled(FALSE);

    }

 

    ...

    ...

                      


À̰Ϳ¡ ÀÇÇØ ContainedWindowÀÇ ¸Þ¼¼Áö´Â ¹øÈ£100ÀÇ ´ëü ¸Þ¼¼Áö ¸ÊÀ¸·Î 󸮵˴ϴÙ. Áï , ContainedWindow (ÀÌ ¿¹¿¡¼­´Â"BUTTON"À» ÁöÁ¤ÇßÀ¸¹Ç·Î ¹öư ÄÁÆ®·Ñ) ¸¦ ¿ÞÂÊ Å¬¸¯Çϸé OnLButtonDownForContained()°¡ ºÒ·Á °©´Ï´Ù.

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

class CMainDlg : public CDialogImpl<CMainDlg>

{

    ...

    ...

 

    enum { IDC_BUTTON_BEEP = 1001 };

 

    LRESULT OnInitDialog(HWND hWnd, LPARAM lParam){

 

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

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

            _T("beep ¹öư"), WS_CHILD | WS_VISIBLE, 0, IDC_BUTTON_BEEP);

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

        // m_contained.SubclassWindow(GetDlgItem(IDC_BUTTON_BEEP));

 

        return TRUE;

    }

 

    ...

    ...

                      


ÀÌ¿Í °°ÀÌ ContainedWindow¸¦ »ç¿ëÇϸé CBeepButton¿Í °°ÀÌ »õ·Î¿î Ŭ·¡½º¸¦ ¸¸µéÁö ¾Ê¾Æµµ ÄÁÆ®·ÑÀÇ µ¿ÀÛÀ» º¯°æÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù.

¡¡
´ÙÀ½¿¡ ³ªÅ¸³»´Â °ÍÀº Ŭ¸¯µÇ¾úÀ» ¶§¿¡ beep À½À» ¿ï¸®´Â ¹öư(beep ¹öư)À»  ContainedWindow¸¦ »ç¿ëÇØ ÀÛ¼ºÇÏ´Â ¿¹ÀÔ´Ï´Ù.

 

// 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 };

 

    CContainedWindow m_contained;

 

    // constructor¡¡ ¡¡

    CMainDlg() : m_contained(_T("BUTTON"), this, 100)

    {}

 

    // ¸Þ¼¼Áö ¸Ê

    BEGIN_MSG_MAP_EX(CMainDlg)

        MSG_WM_INITDIALOG(OnInitDialog)

        COMMAND_ID_HANDLER_EX(IDOK, OnOK)

        COMMAND_ID_HANDLER_EX(IDCANCEL, OnCancel)

    ALT_MSG_MAP(100)

        MSG_WM_LBUTTONDOWN(OnLButtonDownForContained)

    END_MSG_MAP()

 

    void OnLButtonDownForContained(UINT uFlags, CPoint pt){

        MessageBeep(MB_ICONASTERISK);

        SetMsgHandled(FALSE);

    }

 

    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_contained.SubclassWindow(GetDlgItem(IDC_BUTTON_BEEP));

 

        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 "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¸¦ ´ÙÀ½°ú °°ÀÌ ÁöÁ¤ÇÕ´Ï´Ù.

ÄÁÆ®·Ñ¸í

¸®¼Ò½º ID

Ǫ½¬ ¹öư

IDC_BUTTON_BEEP


¡¡
´ÙÀ½¿¡ CMainDlg Ŭ·¡½º¿¡¼­ beep ¹öư ¿ëÀ¸·Î ContainedWindow Ŭ·¡½ºÀÇ ÀνºÅϽº¸¦ ¸â¹ö º¯¼ö·Î¼­ ¼±¾ðÇÕ´Ï´Ù. À̰ÍÀº CMainDlg Ŭ·¡½ºÀÇ constructor¡¡ ¡¡ À¸·Î ÃʱâÈ­ÇÕ´Ï´Ù.

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