¸ð´Þ¸®½º ´ÙÀ̾ó·Î±×¸¦ ÀÛ¼ºÇÏ´Â °æ¿ìµµ ¸ð´ú ´ÙÀ̾ó·Î±×¿Í °°°Ô CDialogImplŬ·¡½º¸¦ »ç¿ëÇÕ´Ï´Ù.

¡¡ÀÌÇÏ¿¡ ³ªÅ¸³»´Â °ÍÀº ¸ð´Þ¸®½º ´ÙÀ̾ó·Î±×¸¦ Ç¥½ÃÇϱ⸸ ÇÏ¸é µÇ´Â °£´ÜÇÑ ÇÁ·Î±×·¥ÀÇ ¿ø½Ã ÄÚµåÀÔ´Ï´Ù. ÀÌ ÇÁ·Î±×·¥¿¡¼­´Â  ¸ð´ú ´ÙÀ̾ó·Î±×¿Í °°ÀÌ CDialogImpl Ŭ·¡½º·ÎºÎÅÍ »ó¼Ó Ŭ·¡½º CMainDlg( À̰ÍÀÌ ¸ÞÀÎ À©µµ¿ì°¡ µË´Ï´Ù ) ¸¦ ¸¸µé¾î  CMainDlg Ŭ·¡½º³»¿¡¼­ WM_INITDIALOG ¸Þ¼¼Áö¿¡ÀÇ ÀÀ´ä°ú  IDOK, IDCANCEL¶ó°í ÇÏ´Â ID¸¦ °¡Áö´Â WM_COMMAND ¸Þ¼¼Áö¿¡ÀÇ ÀÀ´äÀ» Á¤ÀÇÇϰí ÀÖ½À´Ï´Ù. µ¡ºÙ¿© ÀÌ ÇÁ·Î±×·¥Àº Win32 Application ÇÁ·ÎÁ§Æ®·Î ºôµå ÇÕ´Ï´Ù.

 

// 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 CMessageFilter, public CIdleHandler

{

public:

    enum { IDD = IDD_DIALOG1 };

 

    virtual BOOL PreTranslateMessage(MSG* pMsg){

        return IsDialogMessage(pMsg);

    }

 

    virtual BOOL OnIdle(){

        return FALSE;

    }

 

    // ¸Þ¼¼Áö ¸Ê

    BEGIN_MSG_MAP_EX(CMainDlg)

        MSG_WM_INITDIALOG(OnInitDialog)

        COMMAND_ID_HANDLER_EX(IDOK, OnOK)

        COMMAND_ID_HANDLER_EX(IDCANCEL, OnCancel)

    END_MSG_MAP()

 

    LRESULT OnInitDialog(HWND hWnd, LPARAM lParam){

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

        CenterWindow();

 

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

        HICON hIcon = AtlLoadIconImage(IDI_ICON_MAIN, LR_DEFAULTCOLOR,

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

        SetIcon(hIcon, TRUE);

       

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

        HICON hIconSmall = AtlLoadIconImage(IDI_ICON_MAIN, LR_DEFAULTCOLOR,

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

        SetIcon(hIconSmall, FALSE);

 

        // ¸Þ½ÃÁö ·çÇÁ¿¡ ¸Þ¼¼Áö ÇÊÅÍ¿Í ¾ÆÀ̵¹ Çڵ鷯¸¦ Ãß°¡

        CMessageLoop* pLoop = _Module.GetMessageLoop();

        pLoop->AddMessageFilter(this);

        pLoop->AddIdleHandler(this);

 

        return TRUE;

    }

 

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

        DestroyWindow();

        ::PostQuitMessage(nID);

    }

 

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

        DestroyWindow();

        ::PostQuitMessage(nID);

    }

};

                      

 

// modaless.cpp

#include "stdafx.h"

 

#include "resource.h"

 

#include "MainDlg.h"

 

CAppModule _Module;

 

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

{

    _Module.Init(NULL, hInstance);

 

    CMessageLoop theLoop;

    _Module.AddMessageLoop(&theLoop);

 

    CMainDlg dlgMain;

    dlgMain.Create(NULL);

    dlgMain.ShowWindow(nCmdShow);

 

    int nRet = theLoop.Run();

 

    _Module.RemoveMessageLoop();

 

    _Module.Term();

 

    return nRet;

}

                      


¡¡À©µµ¿ì¶§¿Í °°ÀÌ CAppModule Ŭ·¡½ºÀÇ ÀνºÅϽº¸¦ ±Û·Î¹úÇÏ°Ô ¼±¾ðÇØ  _tWinMain()ÀÇ ÃÖÃÊ¿Í ÃÖÈÄ·Î ÃʱâÈ­¿Í µÚ󸮸¦ Çϰí ÀÖ½À´Ï´Ù. ¸ð´Þ¸®½º ´ÙÀ̾ó·Î±×¸¦ ÀÛ¼ºÇÏ·Á¸é Create()¸¦ È£ÃâÇÕ´Ï´Ù.

¡¡CMainDlg Ŭ·¡½º´Â CDialogImpl Ŭ·¡½º·ÎºÎÅÍ ÆÄ»ýÇϰí ÀÖ½À´Ï´Ù¸¸ CDialogImplÀÇ Á¦1ÅÛÇø´ Àμö¿¡µµ  CMainDlg ¶ó´Â À̸§À» °Ç³×ÁÝ´Ï´Ù ( Á¦2ÅÛÇø´ Àμö´Â »ý·« °¡´ÉÇÕ´Ï´Ù. ¿©±â¿¡¼­´Â »ý·« Çϰí ÀÖ½À´Ï´Ù. ). CMainDlg Ŭ·¡½º³»¿¡¼­´Â public ¼±¾ðÀÇ enum¿¡ ÀÇÇØ ´ÙÀ̾ó·Î±× ÀÚ¿ø IDÀ» Á¤ÀÇÇØ , ¸Þ¼¼Áö ¸Ê¿¡ ÀÇÇØ ¸Þ¼¼Áö¿Í  ±×¿¡ ´ëÇÑ Çڵ鷯¸¦ ¹­°í ÀÖ½À´Ï´Ù.

ÀÌ ÇÁ·Î±×·¥¿¡¼­´Â ÀÚ¿ø ID°¡ IDOK ¶Ç´Â IDCANCELÀÇ ¹öưÀ» ´©¸£¸é ÇÁ·Î±×·¥À» Á¾·áÇϵµ·Ï Çϰí ÀÖ½À´Ï´Ù. À̹ø  ¿¹¿¡¼­´Â ¸ð´Þ¸®½º ´ÙÀ̾ó·Î±×°¡ ¸ÞÀÎ À©µµ¿ì°¡ µÇ¹Ç·Î  ¹öưÀ» ´­·¶À» ¶§¿¡ DestroyWindow()¸¦ È£ÃâÇØ À©µµ¿ì¸¦ ÆÄ±âÇØ PostQuitMessage()¸¦ È£ÃâÇØ ¸Þ½ÃÁö ·çÇÁ¸¦ Á¾·á½Ã۰í ÀÖ½À´Ï´Ù.

¡¡µ¡ºÙ¿© ¸ð´Þ¸®½º ´ÙÀ̾ó·Î±×´Â ¸ð´ú ´ÙÀ̾ó·Î±×¿Í ´Þ¸®CMessageLoop Ŭ·¡½º¿¡¼­ ¸Þ½ÃÁö ·çÇÁ¸¦ °ü¸®ÇÒ ¼ö Àֱ⠶§¹®¿¡ CMessageFilter Ŭ·¡½º³ª CIdleHandler Ŭ·¡½º¸¦ »ç¿ëÇØ ¸Þ¼¼Áö ÇÊÅͳª ¾ÆÀ̵é Çڵ鷯¸¦ ÀÌ¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. À§ÀÇ ¿¹¿¡¼­´Â  ¸Þ¼¼Áö ÇÊÅÍ·Î IsDialogMessage()¸¦ È£ÃâÇϰí ÀÖ½À´Ï´Ù.