Áö±Ý±îÁöÀÇ ÇÁ·Î±×·¥¿¡´Â µµ±¸¸ðÀ½ÀÌ ¾ø¾ú½À´Ï´Ù. ¿©±â¿¡¼­´Â CWndClassInfo±¸Á¶Ã¼¸¦ »ç¿ëÇØ  ¡¸Hello, ATL/WTL¡¹ÇÁ·Î±×·¥¿¡ µµ±¸¸ðÀ½À» Ãß°¡ÇÕ´Ï´Ù.

 

// stdafx.h³»

#include <atlbase.h>

#include <atlapp.h>

extern CAppModule _Module;

#include <atlwin.h>

 

#include <atlcrack.h>

#include <atlmisc.h>

                      

 

// MainWindow.h³»

class CMyWindow : public CWindowImpl<CMyWindow>,

    public CMessageFilter, public CIdleHandler

{

public:

    // À©µµ¿ì Ŭ·¡½º¸í , µµ±¸¸ðÀ½À» µî·Ï

    static CWndClassInfo& GetWndClassInfo()

    {

        static CWndClassInfo wc =

        {

            {sizeof(WNDCLASSEX), CS_HREDRAW | CS_VREDRAW, StartWindowProc,

            0, 0, NULL, NULL, NULL, (HBRUSH)(COLOR_WINDOW + 1),

            MAKEINTRESOURCE(IDR_MENU_MAIN),          // µµ±¸¸ðÀ½

            "Hello", NULL},

            NULL, NULL, IDC_ARROW, TRUE, 0, _T("")

        };

        return wc;

    }

 

private:

    // ¸Þ¼¼Áö ÇÊÅÍ Ã³¸®

    virtual BOOL PreTranslateMessage(MSG* pMsg){

        return FALSE;

    }

 

    // ¾ÆÀ̵¹ ó¸®

    virtual BOOL OnIdle(){

        return FALSE;

    }

 

    // ¸Þ¼¼Áö ¸Ê

    BEGIN_MSG_MAP_EX(CMyWindow)

        MSG_WM_PAINT(OnPaint)

        MSG_WM_CREATE(OnCreate)

        MSG_WM_DESTROY(OnDestroy)

        COMMAND_ID_HANDLER_EX(ID_MENUITEM_EXIT, OnMenuExit)

    END_MSG_MAP()

 

    void OnPaint(HDC /*hDC*/){

        CPaintDC dc(m_hWnd);

        CRect rect;

        GetClientRect(rect);

        dc.DrawText(_T("Hello, ATL/WTL"), -1,

            rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);

    }

 

    LRESULT OnCreate(LPCREATESTRUCT lpcs){

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

        CMessageLoop* pLoop = _Module.GetMessageLoop();

        pLoop->AddMessageFilter(this);

        pLoop->AddIdleHandler(this);

        return 0;

    }

 

    void OnDestroy(){

        PostQuitMessage(0);

    }

 

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

        PostMessage(WM_CLOSE);

    }

};

                      

 

// hello.cpp³»

#include "stdafx.h"

 

#include "resource.h"

 

#include "MainWindow.h"

 

CAppModule _Module;

 

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

{

    _Module.Init(NULL, hInstance);

 

    CMessageLoop theLoop;

    _Module.AddMessageLoop(&theLoop);

 

    // µ¶ÀÚ À©µµ¿ì¸¦ ÀÛ¼º

    CMyWindow wnd;

    wnd.Create(NULL, CWindow::rcDefault,

        _T("Hello, ATL/WTL"), WS_OVERLAPPEDWINDOW | WS_VISIBLE);

 

    int nRet = theLoop.Run();

 

    _Module.RemoveMessageLoop();

 

    _Module.Term();

 

    return nRet;

}

                      


¡¡¿ì¼±  µµ±¸¸ðÀ½À» À§ÇÑ ¸Þ´º ÀÚ¿øÀ» ÇÁ·ÎÁ§Æ®¿¡ Ãß°¡ÇÕ´Ï´Ù. ¸Þ´º ÀÚ¿øÀÇ °ÍIDÀº IDR_MENU_MAINÀ¸·Î ÇØ  Åé ·¹º§¿¡[ÆÄÀÏ]À»  ±× ¾Æ·¡¿¡[Á¾·á]¶ó°í ÇÏ´Â ¸Þ´º ¾ÆÀÌÅÛÀ» Ãß°¡ÇÕ´Ï´Ù.  [Á¾·á]¸Þ´º ¾ÆÀÌÅÛ¿¡´ÂID_MENUITEM_EXITÀ̶ó°í ÇÏ´ÂIDÀ» ¼³Á¤ÇÕ´Ï´Ù.



´ÙÀ½¿¡  ÇÁ·ÎÁ§Æ®³»ÀÇ resource file(È®ÀåÀÚ(extension).rc) ¸¦ ¸Þ¸ðÀåµîÀÇ ÅØ½ºÆ® ¹®ÀÚ ÆíÁý±â·Î ¿­¾î ¡¸afxres.h¡¹À̶ó°í ÇÏ´Â ¹®ÀÚ¸¦ ¸ðµÎ ¡¸atlres.h¡¹¿¡ ¿Å°Ü³õ¾Æ µ¡¾²±â º¸Á¸ÇÕ´Ï´Ù. ±×·¯¸é ,Visual C++ ¿¡¼­ ´ÙÀ½°ú °°Àº ´ÙÀ̾ó·Î±×°¡ Ç¥½ÃµÇ¹Ç·Î [³×]¸¦ ¼±ÅÃÇÕ´Ï´Ù.



µ¡ºÙ¿©ATL/WTL AppWizard ·Î ÀÛ¼ºÇßÀ» °æ¿ì´Â, ÀÌ¿Í °°ÀÌ resource file¸¦ Á÷Á¢ ÅØ½ºÆ® ¹®ÀÚ ÆíÁý±â·Î ÆíÁýÇÒ ÇÊ¿ä´Â ¾ø½À´Ï´Ù.

¡¡CMyWindowŬ·¡½º¿¡¼­´Â ,CWndClassInfo±¸Á¶Ã¼¸¦ Ä¿½ºÅ͸¶ÀÌÁî ÇÏ´Â °Í¿¡ ÀÇÇØ  "Hello"¶ó°í ÇÏ´Â À©µµ¿ì Ŭ·¡½º¸í°ú ÀÚ¿øIDÀÌIDR_MENU_MAINÀÇ ¸Þ´º ÀÚ¿øÀ» À©µµ¿ì¿¡ µî·ÏÇϰí ÀÖ½À´Ï´Ù.

¸Þ¼¼Áö ¸Ê¿¡´Â IDÀÌID_MENUITEM_EXITÀÇ Ä¿¸àµå ¸Þ¼¼Áö¿ëÀÇ ¿£Æ®¸®¸¦ Ãß°¡ÇØ  OnMenuExit()¶ó°í ÇÏ´Â ¸Þ¼¼Áö Çڵ鷯¸¦ È£ÃâÇϵµ·Ï Çϰí ÀÖ½À´Ï´Ù.

¡¡hello.cpp¾È¿¡¼­´Â ,resource.hÇì´õ¸¦ ÀÎŬ·çµå ÇÕ´Ï´Ù.