UI°»½Å Çڵ鷯¶õ ÀûÀýÇÑ Å¸À̹Ö(¾ÆÀÌµé ½Ã³ª
WM_INITMENUPOPUP¸Þ¼¼Áö°¡ º¸³»Á® ¿ÔÀ» ¶§ µî ) ¿¡ UI»óŸ¦ °»½ÅÇϱâ À§ÇÑ ±¸Á¶ÀÔ´Ï´Ù. ¿¹¸¦ µé¸é ¸Þ´º ¾ÆÀÌÅÛ¿¡ üũ ¸¶Å©¸¦ ³Ö°Å³ª Åø¹Ù ¹öưÀ» »ç¿ë ºÒ°¡·Î ÇÒ ¶§ µî¿¡ »ç¿ëÇÕ´Ï´Ù. UI°»½Å Çڵ鷯´ÂWTLÀÇCUpdateUIŬ·¡½º¿¡ ÀÇÇØ ½ÇÇöµË´Ï´Ù.
¡¡¿©±â¿¡¼´Â ÀüȸÀÇ »óÅ ¹Ù¸¦ Ãß°¡ÇÑ ¡¸Hello, ATL/WTL¡¹ÇÁ·Î±×·¥ÀÇ µµ±¸¸ðÀ½¿¡ [Ç×»ó ¾Õ¿¡ Ç¥½Ã]¶ó°í ÇÏ´Â ¸Þ´º ¾ÆÀÌÅÛÀ» Ãß°¡ÇÕ´Ï´Ù. ÀÌ ¶§ ¸Þ´º ¾ÆÀÌÅÛÀÌ ¼±ÅÃµÉ ¶§¸¶´Ù UI°»½Å Çڵ鷯¿¡ ÀÇÇØ ¸Þ´º ¾ÆÀÌÅÛÀÇ Ã¼Å© ¸¶Å©ÀÇ ºÎ°¡¿Í ¼Ò°Å¸¦ ¹Ýº¹Çϵµ·Ï ÇÕ´Ï´Ù.

|
// 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 CUpdateUI<CMyWindow> { public: // À©µµ¿ì Ŭ·¡½º¸í , °øÅë ÀÚ¿øID,
½ºÅ¸ÀÏ , ¹è°æ»öÀ» µî·Ï
DECLARE_FRAME_WND_CLASS_EX(_T("Hello"), IDR_MAINFRAME,
CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS, COLOR_WINDOW) // UI°»½Å Çڵ鷯 ¸Ê BEGIN_UPDATE_UI_MAP(CMyWindow)
UPDATE_ELEMENT(ID_MENUITEM_TOPMOST, UPDUI_MENUPOPUP) END_UPDATE_UI_MAP() 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_TOPMOST, OnMenuTopmost)
COMMAND_ID_HANDLER_EX(ID_MENUITEM_HELLO, OnMenuHello) COMMAND_ID_HANDLER_EX(ID_MENUITEM_EXIT,
OnMenuExit)
CHAIN_MSG_MAP(CUpdateUI<CMyWindow>)
// CUpdateUIŬ·¡½º¿¡ üÀÎ
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(); // [Ç×»ó
¾Õ¿¡ Ç¥½Ã]¸Þ´ºÀÇ Ã¼Å© ¸¶Å© ¼³Á¤ 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 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_MENUITEM_TOPMOSTÀ̶ó°í ÇÏ´Â ÀÚ¿øIDÀ» ¼³Á¤ÇÕ´Ï´Ù.

¡¡CUpdateUIŬ·¡½º´Â, ¸ÞÀÎ À©µµ¿ìÀÎCMyWindowŬ·¡½ºÀÇ base class·Î¼ »ç¿ëÇÕ´Ï´Ù. CMyWindowŬ·¡½º¿¡¼´ÂUI°»½Å Çڵ鷯 ¸ÊÀ» ÁغñÇØ °»½ÅÇÏ´Â ¸Þ´º ¾ÆÀÌÅÛÀÇ ÀÚ¿øID°úUIÀÇ Å¸ÀÔÀ» µî·ÏÇÕ´Ï´Ù. µ¡ºÙ¿©UI°»½Å Çڵ鷯 ¸ÊÀºpublic³ª¿ÀÁö ¾ÊÀ¸¸é ¾ÈµË´Ï´Ù.
|
public: // UI°»½Å Çڵ鷯 ¸Ê BEGIN_UPDATE_UI_MAP(CMyWindow) UPDATE_ELEMENT(ID_MENUITEM_TOPMOST,
UPDUI_MENUPOPUP) END_UPDATE_UI_MAP() |
ÀÌ ¿¹¿¡¼´Â pop-up ŸÀÔÀÇ ¸Þ´º ¾ÆÀÌÅÛÀ» µî·ÏÇϹǷΠ,UIÀÇ Å¸ÀÔÀ»UPDUI_MENUPOPUP·Î Çϰí ÀÖ½À´Ï´Ù. UIÀÇ Å¸ÀÔÀº À̰ÍÀ» Æ÷ÇÔÇÏ°í ´ÙÀ½°ú °°Àº °ÍÀÌ ÁغñµÇ¾î ÀÖ½À´Ï´Ù.
|
UIŸÀÔ |
¼³¸í |
|
UPDUI_MENUPOPUP |
pop-up menu(µµ±¸¸ðÀ½ÇÏÀÇ ¸Þ´º ¾ÆÀÌÅÛ Æ÷ÇÔÇÑ´Ù ) |
|
UPDUI_MENUBAR |
µµ±¸¸ðÀ½(Åé ·¹º§ÀÇ ¸Þ´º ¾ÆÀÌÅÛ) |
|
UPDUI_CHILDWINDOW |
ÀÚ À©µµ¿ì |
|
UPDUI_TOOLBAR |
Åø¹Ù |
|
UPDUI_STATUSBAR |
»óÅÂ ¹Ù |
¡¡´ÙÀ½¿¡ ¸Þ¼¼Áö ¸Ê¿¡ base classÀÎCUpdateUIŬ·¡½º¿¡ üÀÎÀ» Ãß°¡ÇÕ´Ï´Ù. À̰ÍÀº À̹ø ¿¹¿¡¼´Â pop-up menu ¾ÆÀÌÅÛÀ» °»½ÅÇϱ⠶§¹®ÀÔ´Ï´Ù. CUpdateUIŬ·¡½º¿¡ üÀÎ ÇÏ´Â °Í¿¡ ÀÇÇØ ¸ÞÀÎ À©µµ¿ì¿¡WM_INITMENUPOPUP¸Þ¼¼Áö°¡ º¸³»Á® ¿Ã ¶§¸¶´Ù CUpdateUIŬ·¡½º¿¡ ¸Þ¼¼Áö°¡ º¸³»Áý´Ï´Ù. CUpdateUIŬ·¡½ºÀÇ base classÀÌ·Á¸éCUpdateUIBaseWM_INITMENUPOPUP¸Þ¼¼Áö Çڵ鷯°¡ ÁغñµÇ¾î ÀÖ¾î ±×·±µ¥
pop-up menu ¾ÆÀÌÅÛ »óŰ¡ °»½ÅµË´Ï´Ù.
¡¡´ÙÀ½¿¡ [Ç×»ó ¾Õ¿¡ Ç¥½Ã]¸Þ´º ¾ÆÀÌÅÛÀÌ ¼±ÅõǾúÀ» ¶§ÀÇ Ä¿¸àµå ¸Þ¼¼Áö Çڵ鷯¸¦ Ãß°¡ÇÕ´Ï´Ù. ¸Þ¼¼Áö ¸Ê¿¡ID°¡ID_MENUITEM_TOPMOSTÀÇ Ä¿¸àµå ¸Þ¼¼Áö¿ëÀÇ ¿£Æ®¸®¸¦ Ãß°¡ÇØ OnMenuTopmost()¶ó°í ÇÏ´Â ¸Þ¼¼Áö Çڵ鷯¸¦ È£ÃâÇϵµ·Ï(µíÀÌ) ÇÕ´Ï´Ù. ÀÌ Çڵ鷯¿¡¼´Â ,UIGetState()¿¡ ÀÇÇØ ÇöÀçÀÇ Ã¼Å© »óŸ¦ ÃëµæÇØ CUpdateUIŬ·¡½ºÀÇ ¸â¹ö ÇÔ¼öÀÎUISetCheck()À¸·Î üũ ¸¶Å©ÀÇ ºÎ°¡¿Í ¼Ò°Å¸¦ ¹Ù²Ù°í ÀÖ½À´Ï´Ù.
¿©±â¼ ÁÖÀÇÇÏÁö ¾ÊÀ¸¸é ¾È µÇ´Â °ÍÀº UISetCheck()À» È£ÃâÇÑ Á÷ÈÄ¿¡ pop-up menu ¾ÆÀÌÅÛÀÇ Ã¼Å© ¸¶Å©°¡ °»½ÅµÇ´Â °ÍÀÌ ¾Æ´Ï¶ó, ¾îµð±îÁö³ª UISetCheck()¸¦ È£ÃâÇÑ ÈÄ¿¡WM_INITMENUPOPUP¸Þ¼¼Áö°¡ º¸³»Á® ¿À°í ³ª¼ , UI°»½Å Çڵ鷯¿¡ ÀÇÇØ ÀÚµ¿ÀûÀ¸·Î °»½ÅµÈ´Ù°í ÇÏ´Â °ÍÀÔ´Ï´Ù.