¿©±â¿¡¼´Â ÀüȸÀÇ ¸®¹ö¸¦ Ãß°¡ÇÑ ¡¸Hello, ATL/WTL¡¹ÇÁ·Î±×·¥¿¡ »óÅ ¹Ù¸¦ Ãß°¡ÇÕ´Ï´Ù. CFrameWindowImplŬ·¡½º¿¡´Â °£´ÜÇÑ »óÅ ¹Ù¸¦ ÀÛ¼ºÇϱâ À§Çؼ CreateSimpleStatusBar()¶ó°í ÇÏ´Â ¸â¹ö ÇÔ¼ö°¡ ÁغñµÇ¾î ÀÖ½À´Ï´Ù.

|
// stdafx.h #include <atlbase.h> #include <atlapp.h> extern CAppModule _Module; #include <atlwin.h> #include <atlcrack.h> #include <atlmisc.h> #include <atlframe.h> // CFrameWindowImplŬ·¡½º¸¦ »ç¿ëÇϱâ À§ÇØ(¶§¹®¿¡) |
|
// MainWindow.h // ¸ÞÀÎ
À©µµ¿ìÀÇ base class¸¦CFrameWindowImpl·Î
º¯°æ class CMyWindow : public CFrameWindowImpl<CMyWindow>, public CMessageFilter, public CIdleHandler { public: // À©µµ¿ì Ŭ·¡½º¸í , °øÅë ÀÚ¿øID,
½ºÅ¸ÀÏ , ¹è°æ»öÀ» µî·Ï
DECLARE_FRAME_WND_CLASS_EX(_T("Hello"), IDR_MAINFRAME,
CS_HREDRAW
| CS_VREDRAW | CS_DBLCLKS, COLOR_WINDOW) private: // ¸Þ¼¼Áö ÇÊÅÍ Ã³¸® virtual
BOOL PreTranslateMessage(MSG* pMsg){ // base classÀÇ °ÍPreTranslateMessageÀ»
È£ÃâÇÏ´Â return CFrameWindowImpl<CMyWindow>::PreTranslateMessage(pMsg); } // ¾ÆÀ̵é ó¸® virtual
BOOL OnIdle(){ return FALSE; } // ¸Þ¼¼Áö ¸Ê BEGIN_MSG_MAP_EX(CMyWindow)
MSG_WM_PAINT(OnPaint)
MSG_WM_CONTEXTMENU(OnContextMenu)
MSG_WM_CREATE(OnCreate)
COMMAND_ID_HANDLER_EX(ID_MENUITEM_HELLO, OnMenuHello)
COMMAND_ID_HANDLER_EX(ID_MENUITEM_EXIT, OnMenuExit)
CHAIN_MSG_MAP(CFrameWindowImpl<CMyWindow>)
// CFrameWindowImplŬ·¡½º¿¡
üÀÎ 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); } void OnContextMenu(HWND hWnd, CPoint pt){ // [Shift]+[F10]۰¡ ¹Ð·ÈÀ» °æ¿ì´Â ÁÂÇ¥¸¦ Ŭ¶óÀÌ¾ðÆ® ¿µ¿ªÀÇ Á»óÀ¸·Î ¼³Á¤ if(pt.x == -1 && pt.y
== -1){
pt.SetPoint(0, 0);
ClientToScreen(&pt); } // ÁÂÇ¥°¡
Ŭ¶óÀÌ¾ðÆ® ¿µ¿ª³»ÀÇ °æ¿ì¸¸ pop-up menu¸¦ Ç¥½Ã CRect rc; GetClientRect(&rc); ClientToScreen(&rc); if(rc.PtInRect(pt)){
CMenu menuPopup;
menuPopup.LoadMenu(IDR_MENU_POPUP);
menuPopup.GetSubMenu(0).TrackPopupMenu(
TPM_LEFTALIGN | TPM_TOPALIGN | TPM_LEFTBUTTON, pt.x,
pt.y, m_hWnd); }else{
SetMsgHandled(false); } } LRESULT OnCreate(LPCREATESTRUCT lpcs){ // ¸®¹ö¸¦ ÀÛ¼º CreateSimpleReBar(); // Åø¹Ù¸¦ ÀÛ¼ºÇØ
¹êµå¿¡ Ãß°¡
HWND hWndToolBar = CreateSimpleToolBarCtrl(m_hWnd,
IDR_MAINFRAME, FALSE, ATL_SIMPLE_TOOLBAR_PANE_STYLE); AddSimpleReBarBand(hWndToolBar); // »óÅÂ
¹Ù¸¦ ÀÛ¼º CreateSimpleStatusBar(); // ¸Þ½ÃÁö
·çÇÁ¿¡ ¸Þ¼¼Áö ÇÊÅÍ¿Í ¾ÆÀ̵¹ Çڵ鷯¸¦ Ãß°¡ CMessageLoop* pLoop = _Module.GetMessageLoop();
pLoop->AddMessageFilter(this); pLoop->AddIdleHandler(this); return 0; } void OnMenuHello(UINT uNotifyCode, int nID, HWND hWndCtl){ MessageBox(_T("Hello, ATL/WTL")); } 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) { // ÄÚ¸Õ ÄÁÆ®·Ñ ¹× ¸®¹ö ÃʱâÈ AtlInitCommonControls(ICC_WIN95_CLASSES
| ICC_COOL_CLASSES); _Module.Init(NULL,
hInstance); CMessageLoop
theLoop; _Module.AddMessageLoop(&theLoop); // µ¶ÀÚ À©µµ¿ì¸¦ ÀÛ¼º CMyWindow
wnd; wnd.CreateEx(); wnd.ShowWindow(nCmdShow); wnd.UpdateWindow(); int nRet = theLoop.Run(); _Module.RemoveMessageLoop(); _Module.Term(); return nRet; } |
¡¡¿ì¼± ÀÚ¿øIDÀÌATL_IDS_IDLEMESSAGE¶ó°í Çϴ ij¸¯ÅÍ ¶óÀÎ ÀÚ¿øÀ» Ãß°¡ÇÕ´Ï´Ù. À̰ÍÀº ¾ÆÀÌµé ½Ã¿¡ »óÅ ¹Ù¿¡ Ç¥½ÃµÇ´Â ij¸¯ÅÍ ¶óÀÎÀÔ´Ï´Ù. ¿©±â¿¡¼´Â ¡¸·¹À̵𡹷μ ÀϾ´Ï´Ù.

¡¡´ÙÀ½¿¡ CMyWindowŬ·¡½ºOnCreate()Áß¿¡¼ CreateSimpleStatusBar()¸¦ È£ÃâÇØ »óÅ ¹Ù¸¦ ÀÛ¼ºÇÕ´Ï´Ù.
µ¡ºÙ¿© CreateSimpleStatusBar()¿¡´Â 2°³ ¹öÁ¯ÀÌ ÀÖ½À´Ï´Ù. ¾çÂÊ ¸ðµÎ 3°³ÀÇ Àμö¸¦ ÁöÁ¤ÇÒ ¼ö ÀÖ½À´Ï´Ù¸¸ ÇÑÆíÀº Á¦1Àμö¿¡ ¾ÆÀ̵¹½Ã¿¡ Ç¥½ÃÇϴ ij¸¯ÅÍ ¶óÀÎÀ» ÁöÁ¤ÇÏ´Â °ÍÀ¸·Î , ÇÑÆíÀº Á¦1Àμö¿¡ ¾ÆÀ̵¹½Ã¿¡ Ç¥½ÃÇϴ ij¸¯ÅÍ ¶óÀÎ ÀÚ¿øÀÇ °ÍIDÀ» ÁöÁ¤ÇÏ´Â °ÍÀÔ´Ï´Ù. ÈÄÀÚ´Â ¸ðµç Àμö¸¦ »ý·« °¡´ÉÇÕ´Ï´Ù. À̹øÀº ¸ðµç Àμö¸¦ »ý·« ÇßÀ¸¹Ç·Î ÈÄÀÚ°¡ »ç¿ëµË´Ï´Ù. ÀÌ °æ¿ì Á¦1Àμö¿¡´Â µðÆúÆ® Àμö·Î¼ATL_IDS_IDLEMESSAGE°¡ ÁöÁ¤µË´Ï´Ù. ¾ç¹öÁ¯ ¸ðµÎ Á¦2Àμö´Â »óÅ ¹ÙÀÇ ½ºÅ¸ÀÏÀÔ´Ï´Ù. µðÆúÆ® Àμö´Â ´ÙÀ½ÀÇ ½ºÅ¸ÀÏÀÔ´Ï´Ù.
|
// atlframe.h³» WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN |
WS_CLIPSIBLINGS | SBARS_SIZEGRIP |
¾ç¹öÁ¯ ¸ðµÎ Á¦3Àμö´Â ½Äº°ÀÚÀÔ´Ï´Ù. µðÆúÆ® Àμö´ÂATL_IDW_STATUS_BARÀÔ´Ï´Ù.
¾î´À ÂÊÀÇ ¹öÁ¯ÀÇ °ÍCreateSimpleStatusBar()µµ °á°úÀûÀ¸·Î ³»ºÎ¿¡¼ ::CreateStatusWindow()¸¦ È£ÃâÇϰí ÀÖ¾î ±× È£Ãâ¿¡ ÀÇÇØ ¾òÀ» ¼ö ÀÖ´ø »óÅ ¹ÙÀÇ ÇÚµéÀ» CFrameWindowImplŬ·¡½ºÀÇ base classÀÎCFrameWindowImplBase Ŭ·¡½ºÀÇ °Ím_hWndStatusBarÀ̶ó°í ÇÏ´ÂHWNDÇüÅÂÀÇ ¸â¹ö º¯¼ö¿¡ ´ëÀÔÇÕ´Ï´Ù.
CFrameWindowImplŬ·¡½ºÀÇ base classÀÎCFrameWindowImplBaseŬ·¡½º¿¡´ÂWM_MENUSELECT¸Þ¼¼Áö Çڵ鷯°¡ ÁغñµÇ¾î ÀÖ½À´Ï´Ù. ÀÌ ¶§¹®¿¡ ¸Þ´º¸¦ ¼±ÅÃÇßÀ» ¶§ÀÇWM_MENUSELECT¸Þ¼¼Áö°¡ üÀÎóÀÇCFrameWindowImplŬ·¡½º¿¡ º¸³»Áö¸é ÀÚµ¿ÀûÀ¸·Îm_hWndStatusBar·Î ½Äº°µÈ »óÅ ¹Ù¿¡ ¸Þ´º ÀÚ¿øÀÇ[prompt]·Î ¼³Á¤ÇÑ Ä³¸¯ÅÍ ¶óÀÎÀÌ Ç¥½ÃµË´Ï´Ù.
