¸Þ½ÃÁö ·çÇÁ¿¡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()°¡ ºÒ·Á °¡°Ô µË´Ï´Ù.