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°»½Å Çڵ鷯¿¡ ÀÇÇØ ÀÚµ¿ÀûÀ¸·Î °»½ÅµÈ´Ù°í ÇÏ´Â °ÍÀÔ´Ï´Ù.