¡¡Åë»ó µµ±¸¸ðÀ½À̳ª Åø¹Ù·ÎºÎÅÍÀÇWM_COMMAND¸Þ¼¼Áö´Â ¸ÞÀÎ À©µµ¿ìÀÇ ¸Þ¼¼Áö ¸ÊÀÌ Ã³¸®ÇÕ´Ï´Ù. ±×·¯³ª ƯÁ¤ÀÇ Å¬·¡½º³ª ºä À©µµ¿ìÀÇ ¸Þ¼¼Áö ¸ÊÀ¸·Î ó¸®ÇÏ°í ½ÍÀº °æ¿ìµµ ÀÖ½À´Ï´Ù. ±×·¯ÇÑ ¶§´Â WTLÀÇ Ä¿¸àµå üÀÎ ¸ÅÅ©·Î¸¦ »ç¿ëÇÕ´Ï´Ù. ATLµµ ¸î°³ÀÇ Ã¼ÀÎ ¸ÅÅ©·Î¸¦ ÁغñÇØ ÀÖ½À´Ï´Ù¸¸ Ä¿¸àµå üÀÎ ¸ÅÅ©·Î´ÂWM_COMMAND¸Þ¼¼Áö Àü¿ëÀÇ Ã¼ÀÎ ¸ÅÅ©·ÎÀÔ´Ï´Ù.
WTL(Àº)´Â ´ÙÀ½°ú °°Àº Ä¿¸àµå üÀÎ ¸ÅÅ©·Î¸¦ ÁغñÇØ ÀÖ½À´Ï´Ù.
¡¡´ÙÀ½¿¡ ³ªÅ¸³»´Â °ÍÀº Àüȸ ºä À©µµ¿ì¸¦À» Ãß°¡ÇÑ ¡¸Hello,
ATL/WTL¡¹ÇÁ·Î±×·¥¿¡ Ä¿¸àµå üÀÎÀ» Ãß°¡ÇØ ºä À©µµ¿ì Ãø¿¡¼ ID°¡ID_MENUITEM_HELLOÀÇ Ä¿¸àµå ¸Þ¼¼Áö¸¦ ó¸®ÇÏ´Â ¿¹ÀÔ´Ï´Ù.
|
// stdafx.h #include <atlbase.h> #include <atlapp.h> extern CAppModule _Module; #include <atlwin.h> #include <atlcrack.h> #include <atlmisc.h> #include <atlframe.h> // CFrameWindowImplŬ·¡½º¸¦ »ç¿ëÇϱâ À§ÇØ(¶§¹®¿¡) |
|
// View.h class CView : public CWindowImpl<CView> { public: // ¸Þ¼¼Áö ÇÊÅÍ Ã³¸® BOOL PreTranslateMessage(MSG*
pMsg){ return FALSE; } private: // ¸Þ¼¼Áö ¸Ê BEGIN_MSG_MAP_EX(CView)
MSG_WM_PAINT(OnPaint) MSG_WM_CONTEXTMENU(OnContextMenu)
COMMAND_ID_HANDLER_EX(ID_MENUITEM_HELLO, OnMenuHello) 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,
GetParent() // Ä£À©µµ¿ìÀÇ ÇÚµé
); }else{ SetMsgHandled(false); } } void OnMenuHello(UINT uNotifyCode, int nID, HWND hWndCtl){ MessageBox(_T("Hello, ATL/WTL")); } }; |
|
// MainWindow.h // ¸ÞÀÎ
À©µµ¿ìÀÇ base class¸¦CFrameWindowImpl·Î
º¯°æ class CMyWindow : public CFrameWindowImpl<CMyWindow>, public CMessageFilter, public CIdleHandler, public CUpdateUI<CMyWindow> { public: // À©µµ¿ì Ŭ·¡½º¸í , °øÅë ÀÚ¿øIDÀ»
µî·Ï
DECLARE_FRAME_WND_CLASS(_T("Hello"), IDR_MAINFRAME) // UI°»½Å Çڵ鷯 ¸Ê BEGIN_UPDATE_UI_MAP(CMyWindow)
UPDATE_ELEMENT(ID_MENUITEM_TOPMOST, UPDUI_MENUPOPUP | UPDUI_TOOLBAR) END_UPDATE_UI_MAP() private: CView
m_view; // ¸Þ¼¼Áö ÇÊÅÍ Ã³¸® virtual
BOOL PreTranslateMessage(MSG* pMsg){ // base classÀÇ °ÍPreTranslateMessageÀ»
È£ÃâÇÏ´Â if(CFrameWindowImpl<CMyWindow>::PreTranslateMessage(pMsg))
return TRUE; // ºäÀ©µå¿ìÅ©¶ó½ºÀÇ °ÍPreTranslateMessageÀ» È£ÃâÇÏ´Â return m_view.PreTranslateMessage(pMsg); } // ¾ÆÀ̵¹ ó¸® virtual
BOOL OnIdle(){ UIUpdateToolBar();
return FALSE; } // ¸Þ¼¼Áö ¸Ê BEGIN_MSG_MAP_EX(CMyWindow)
MSG_WM_CREATE(OnCreate)
COMMAND_ID_HANDLER_EX(ID_MENUITEM_TOPMOST, OnMenuTopmost)
COMMAND_ID_HANDLER_EX(ID_MENUITEM_EXIT, OnMenuExit)
CHAIN_MSG_MAP(CUpdateUI<CMyWindow>)
// CUpdateUIŬ·¡½º¿¡ üÀÎ
CHAIN_MSG_MAP(CFrameWindowImpl<CMyWindow>)
// CFrameWindowImplŬ·¡½º¿¡
üÀÎ
CHAIN_CLIENT_COMMANDS()
// ºäÀ©µå¿ì¿¡ üÀÎ END_MSG_MAP() LRESULT OnCreate(LPCREATESTRUCT lpcs){ // ¸®¹ö¸¦ ÀÛ¼º CreateSimpleReBar(); // Åø¹Ù¸¦ ÀÛ¼ºÇØ
¹êµå¿¡ Ãß°¡
HWND hWndToolBar = CreateSimpleToolBarCtrl(m_hWnd,
IDR_MAINFRAME, FALSE, ATL_SIMPLE_TOOLBAR_PANE_STYLE); AddSimpleReBarBand(hWndToolBar); UIAddToolBar(hWndToolBar); // »óÅÂ
¹Ù¸¦ ÀÛ¼º CreateSimpleStatusBar(); // ºäÀ©µå¿ì¸¦ ÀÛ¼º m_hWndClient = m_view.Create(m_hWnd, rcDefault, NULL,
WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
WS_EX_CLIENTEDGE);
// [Ç×»ó
¾Õ¿¡ Ç¥½Ã]¸Þ´ºÀÇ Ã¼Å© ¸¶Å© ¼³Á¤ UISetCheck(ID_MENUITEM_TOPMOST, false); // ¸Þ½ÃÁö
·çÇÁ¿¡ ¸Þ¼¼Áö ÇÊÅÍ¿Í ¾ÆÀ̵¹ Çڵ鷯¸¦ Ãß°¡ CMessageLoop* pLoop = _Module.GetMessageLoop(); pLoop->AddMessageFilter(this); pLoop->AddIdleHandler(this); return 0; } void OnMenuTopmost(UINT uNotifyCode,
int nID, HWND hWndCtl){ bool bTopmost = !(UIGetState(nID) &
UPDUI_CHECKED); SetWindowPos(bTopmost ? HWND_TOPMOST : HWND_NOTOPMOST,
0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW); UISetCheck(nID, bTopmost); } void OnMenuExit(UINT uNotifyCode, int nID, HWND hWndCtl){ PostMessage(WM_CLOSE); } }; |
|
// hello.cpp #include "stdafx.h" #include "resource.h" #include "View.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ÀÌID_MENUITEM_HELLOÀÇ Ä¿¸àµå ¸Þ¼¼Áö¿ë ¸Þ¼¼Áö ¸Ê ¿£Æ®¸®¿Í ¸Þ¼¼Áö Çڵ鷯¸¦ CMyWindowŬ·¡½º¿¡¼CViewŬ·¡½º¿¡ À̵¿ÇÕ´Ï´Ù. ±×¸®°í CMyWindowŬ·¡½ºÀÇ ¸Þ¼¼Áö ¸Ê¿¡ CHAIN_CLIENT_COMMANDS() Ä¿¸àµå üÀÎ ¸ÅÅ©·Î¸¦ Ãß°¡ÇÕ´Ï´Ù.
À̰Ϳ¡ ÀÇÇØ ¸ÞÀÎ À©µµ¿ìÀÎCMyWindowŬ·¡½º¿¡¼ 󸮵ÇÁö ¾Ê´Â ID_MENUITEM_HELLOÄ¿¸àµå ¸Þ¼¼Áö´Â ºä À©µµ¿ìÀÎ CViewŬ·¡½º¿¡ º¸³»Á® CViewŬ·¡½ºÀÇ OnMenuHello()ÀÌ ºÒ·Á °¡°Ô µË´Ï´Ù.
µ¡ºÙ¿© À§ÀÇ ¿¹¿¡¼´ÂCHAIN_CLIENT_COMMANDS()¸ÅÅ©·Î¸¦ »ç¿ëÇß½À´Ï´Ù¸¸ CHAIN_COMMANDS_MEMBER()¸ÅÅ©·Î¿¡¼µµ °°Àº °ÍÀÌ »ý±é´Ï´Ù. ±× °æ¿ì´Â ºä À©µµ¿ì Ŭ·¡½ºÀÇ ÀνºÅϽº¸¦ ÁöÁ¤ÇÕ´Ï´Ù.
|
CView m_view; // ºäÀ©µå¿ìÀÇ ÀνºÅϽº ... ... // CMyWindowŬ·¡½ºÀÇ ¸Þ¼¼Áö ¸Ê BEGIN_MSG_MAP_EX(CMyWindow) MSG_WM_CREATE(OnCreate)
COMMAND_ID_HANDLER_EX(ID_MENUITEM_TOPMOST, OnMenuTopmost)
COMMAND_ID_HANDLER_EX(ID_MENUITEM_EXIT, OnMenuExit) CHAIN_MSG_MAP(CUpdateUI<CMyWindow>)
// CUpdateUIŬ·¡½º¿¡ üÀÎ CHAIN_MSG_MAP(CFrameWindowImpl<CMyWindow>) // CFrameWindowImplŬ·¡½º¿¡ üÀÎ CHAIN_COMMANDS_MEMBER(m_view)
// ºäÀ©µå¿ì¿¡ üÀÎ END_MSG_MAP() |