¸Þ½ÃÁö ·çÇÁ¿¡CMessageLoopŬ·¡½º¸¦ »ç¿ëÇϸé CIdleHandlerŬ·¡½º¸¦ »ç¿ëÇØ ¾ÆÀ̵é Çڵ鷯¸¦ Ãß°¡ÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù. ¾ÆÀ̵é Çڵ鷯¸¦ Ãß°¡Çϸé CMessageLoopŬ·¡½º³»ÀÇ ¸Þ½ÃÁö ·çÇÁ·Î ó¸®ÇÏ´Â ¸Þ¼¼Áö°¡ ¾øÀ» ¶§¿¡  ¾ÆÀ̵é 󸮸¦ ½Ãų ¼ö°¡ ÀÖ½À´Ï´Ù.

¿©±â¿¡¼­´Â  ÀÌCIdleHandlerŬ·¡½º¸¦ »ç¿ëÇØ  ÀüȸÀÇ ¸Þ¼¼Áö ÇÊÅ͸¦ Ãß°¡ÇÑ ¡¸Hello, ATL/WTL¡¹ÇÁ·Î±×·¥¿¡ ¾ÆÀ̵é Çڵ鷯¸¦ Ãß°¡ÇÕ´Ï´Ù. º¯°æÇÏ´Â °ÍÀºCMyWindowŬ·¡½º ¸¸ÀÔ´Ï´Ù.

// stdafx.h¾È

#include <atlbase.h>

#include <atlapp.h>

extern CAppModule _Module;  // CComModuleÀ¸·ÎºÎÅÍCAppModule¿¡ ¿Å°Ü³õ´Â

#include <atlwin.h>

 

#include <atlcrack.h> // WTL¸Þ¼¼Áö Å©·¡Ä¿¸¦ »ç¿ëÇϱâ (À§ÇØ)¶§¹®¿¡

                      

 

// MainWindow.hµ¿¾È

// base class¿¡CMessageFilterCIdleHandler¸¦ Ãß°¡

class CMyWindow : public CWindowImpl<CMyWindow>,

    public CMessageFilter, public CIdleHandler

{

public:

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

    DECLARE_WND_CLASS(_T("Hello"));

 

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)

    END_MSG_MAP()

 

    void OnPaint(HDC /*hDC*/){

        PAINTSTRUCT ps;

        HDC hDC = BeginPaint(&ps);

        RECT rect;

        GetClientRect(&rect);

        DrawText(hDC, _T("Hello, ATL/WTL"),

            -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);

        EndPaint(&ps);

    }

 

    LRESULT OnCreate(LPCREATESTRUCT lpcs){

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

        CMessageLoop* pLoop = _Module.GetMessageLoop();

        pLoop->AddMessageFilter(this);

        pLoop->AddIdleHandler(this);

        return 0;

    }

 

    void OnDestroy(){

        PostQuitMessage(0);

    }

};

                      

 

// hello.cpp³»

#include "stdafx.h"

 

#include "MainWindow.h"

 

CAppModule _Module;  // CComModule·ÎºÎÅÍCAppModule¿¡ ¿Å°Ü³õ´Â

 

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;

}

                      


¡¡CIdleHandlerŬ·¡½º´Â  ¸ÞÀÎ À©µµ¿ìÀÎCMyWindowŬ·¡½ºÀÇ base class·Î¼­ »ç¿ëÇϰí ÀÖ½À´Ï´Ù.  CIdleHandlerŬ·¡½º¿¡´ÂOnIdle()À̶ó°í ÇÏ´Â ¼ø¼ö °¡»ó ÇÔ¼ö°¡ ÇÑ °³ ÀÖÀ» »ÓÀÔ´Ï´Ù.

// atlapp.h¾È

class CIdleHandler

{

public:

    virtual BOOL OnIdle() = 0;

};

                      


CIdleHandlerŬ·¡½ºÀÇ »ó¼Ó Ŭ·¡½ºÀÎCMyWindowŬ·¡½º ¿¡¼­´Â  ÀÌOnIdle()¸¦ ±¸ÇöÇÕ´Ï´Ù. À̹ø ¿¹¿¡¼­´ÂFALSEÀ» µ¹·ÁÁÖ°í ÀÖ½À´Ï´Ù¸¸  ÀÌ °ªÀº üũµÇ¾î ÀÖÁö ¾ÊÀº °Í °°½À´Ï´Ù.

¡¡±×¸®°í CMyWindowŬ·¡½ºÀÇ WM_CREATE¸Þ¼¼Áö Çڵ鷯¿¡¼­´Â  AddIdleHandler()À» È£ÃâÇÏ´Â °Í¿¡ ÀÇÇØ  ¸Þ½ÃÁö ·çÇÁ¿¡ ÀÌ À©µµ¿ì¿ëÀÇ ¾ÆÀ̵é Çڵ鷯¸¦ Ãß°¡Çϰí ÀÖ½À´Ï´Ù. À̰Ϳ¡ ÀÇÇØ  ¾ÆÀÌµé ½Ã°¡ µÉ ¶§¸¶´Ù CMyWindowŬ·¡½º¿¡¼­ ±¸ÇöÇß´ø OnIdle()°¡ ºÒ·Á °¡°Ô µË´Ï´Ù.