ÀüȸÀÇ pop-up menu ¾ÆÀÌÅÛ¿ëÀÇUI°»½Å Çڵ鷯´Â  ¸ð´ú ´ÙÀ̾ó·Î±×¿¡¼­µµ ¸ð´Þ¸®½º ´ÙÀ̾ó·Î±×¿¡¼­µµ À¯È¿Çß½À´Ï´Ù¸¸  pop-up menu ¾ÆÀÌÅÛ ÀÌ¿Ü (µµ±¸¸ðÀ½ , Åø¹Ù , »óÅ ¹Ù , ¾ÆÀÌ À©µµ¿ì) ÀÇ UI°»½Å Çڵ鷯´Â ¸ð´Þ¸®½º ´ÙÀ̾ó·Î±×·Î ¹Û¿¡ »ç¿ëÇÒ ¼ö ¾ø½À´Ï´Ù. ¿Ö³ÄÇÏ¸é  pop-up menu ¾ÆÀÌÅÛ ÀÌ¿ÜÀÇ UI°»½Å Çڵ鷯´Â ±âº»ÀûÀ¸·Î ¾ÆÀÌµé  Çڵ鷯·Î ºÒ·Á °©´Ï´Ù¸¸  ¸ð´ú ´ÙÀ̾ó·Î±×¿¡´Â ¾ÆÀ̵é Çڵ鷯°¡ ¾ø±â ¶§¹®ÀÔ´Ï´Ù.

¡¡¿©±â¿¡¼­´Â  Àüȸ pop-up menu ¾ÆÀÌÅÛ¿ëÀÇUI°»½Å Çڵ鷯¸¦ Ãß°¡ÇÑ ¸ð´Þ¸®½º ´ÙÀ̾ó·Î±×¿¡  ÀÚ½Ä À©µµ¿ì¿ëÀÇ UI°»½Å Çڵ鷯¸¦ Ãß°¡ÇÕ´Ï´Ù. ÀÌ ¶§  ¸Þ´ºÀÇ[Ç×»ó ¾Õ¿¡ Ç¥½Ã]ÀÇ ¿Â/¿ÀÇÁ¿¡ ÀÇÇØ  ´ÙÀ̾ó·Î±×»óÀÇ [ĵ½½] ¹öưÀ» »ç¿ë°¡´É/»ç¿ë ºÒ°¡°¡ µÇµµ·Ï ÇØ º¸°Ú½À´Ï´Ù. ÀÌ¿Í °°ÀÌ  ÀÚ½Ä À©µµ¿ì¿ëÀÇ UI°»½Å Çڵ鷯´Â ÁÖ·Î  ´ÙÀ̾ó·Î±×¸¦  ¡¸ÄÁÅ×À̳ʡ¹·Î¼­  ´ÙÀ̾ó·Î±×»óÀÇ ÄÁÆ®·Ñ »óŸ¦ °»½ÅÇÒ °æ¿ì¿¡ »ç¿ëÇÕ´Ï´Ù.

 

 

// stdafx.h

#include <atlbase.h>

#include <atlapp.h>

extern CAppModule _Module;

#include <atlwin.h>

 

#include <atlcrack.h>

#include <atlmisc.h>

#include <atlframe.h>

                      

 

// MainDlg.h

class CMainDlg : public CDialogImpl<CMainDlg>,

    public CMessageFilter, public CIdleHandler, public CUpdateUI<CMainDlg>

{

public:

    enum { IDD = IDD_DIALOG1 };

 

    virtual BOOL PreTranslateMessage(MSG* pMsg){

        return IsDialogMessage(pMsg);

    }

 

    virtual BOOL OnIdle(){

        UIUpdateChildWindows();

        return FALSE;

    }

 

    // UI°»½Å Çڵ鷯 ¸Ê

    BEGIN_UPDATE_UI_MAP(CMainDlg)

        UPDATE_ELEMENT(ID_MENUITEM_TOPMOST, UPDUI_MENUPOPUP)

        UPDATE_ELEMENT(IDCANCEL, UPDUI_CHILDWINDOW)

    END_UPDATE_UI_MAP()

 

    // ¸Þ¼¼Áö ¸Ê

    BEGIN_MSG_MAP_EX(CMainDlg)

        MSG_WM_INITDIALOG(OnInitDialog)

        COMMAND_ID_HANDLER_EX(ID_MENUITEM_TOPMOST, OnMenuTopmost)

        COMMAND_ID_HANDLER_EX(IDOK, OnOK)

        COMMAND_ID_HANDLER_EX(IDCANCEL, OnCancel)

        CHAIN_MSG_MAP(CUpdateUI<CMainDlg>) 

    END_MSG_MAP()

 

    LRESULT OnInitDialog(HWND hWnd, LPARAM lParam){

        // ½ºÅ©¸°ÀÇ Áß¾Ó¿¡ ¹èÄ¡

        CenterWindow();

 

        // Å« ¾ÆÀÌÄÜ ¼³Á¤

        HICON hIcon = AtlLoadIconImage(IDI_ICON_MAIN, LR_DEFAULTCOLOR,

            ::GetSystemMetrics(SM_CXICON), ::GetSystemMetrics(SM_CYICON));

        SetIcon(hIcon, TRUE);

       

        // ÀÛÀº ¾ÆÀÌÄÜ ¼³Á¤

        HICON hIconSmall = AtlLoadIconImage(IDI_ICON_MAIN, LR_DEFAULTCOLOR,

            ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON));

        SetIcon(hIconSmall, FALSE);

 

        // ¸Þ½ÃÁö ·çÇÁ¿¡ ¸Þ¼¼Áö ÇÊÅÍ¿Í ¾ÆÀ̵¹ Çڵ鷯¸¦ Ãß°¡

        CMessageLoop* pLoop = _Module.GetMessageLoop();

        pLoop->AddMessageFilter(this);

        pLoop->AddIdleHandler(this);

 

        // ´ÙÀ̾ó·Î±× ÇÚµéÀ» ¾ÆÀÌ À©µµ¿ì¿ëÀÇUI°»½Å Çڵ鷯¿¡ Ãß°¡

        UIAddChildWindowContainer(m_hWnd);

       

        // [ĵ½½]¹öưÀÇ »ç¿ë °¡ºÎ ¼³Á¤

        UIEnable(IDCANCEL, FALSE);

       

        // [Ç×»ó ¾Õ¿¡ Ç¥½Ã]¸Þ´ºÀÇ Ã¼Å© ¸¶Å© ¼³Á¤

        UISetCheck(ID_MENUITEM_TOPMOST, false);

 

        return TRUE;

    }

 

    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);

 

        // [ĵ½½]¹öưÀÇ »ç¿ë °¡ºÎ ¼³Á¤

        UIEnable(IDCANCEL, bTopmost);

    }

 

    void OnOK(UINT uNotifyCode, int nID, HWND hWndCtl){

        DestroyWindow();

        ::PostQuitMessage(nID);

    }

 

    void OnCancel(UINT uNotifyCode, int nID, HWND hWndCtl){

        DestroyWindow();

        ::PostQuitMessage(nID);

    }

};

                      

 

// modaless.cpp

#include "stdafx.h"

 

#include "resource.h"

 

#include "MainDlg.h"

 

CAppModule _Module;

 

int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE, LPTSTR lpCmdLine, int nCmdShow)

{

    _Module.Init(NULL, hInstance);

 

    CMessageLoop theLoop;

    _Module.AddMessageLoop(&theLoop);

 

    CMainDlg dlgMain;

    dlgMain.Create(NULL);

    dlgMain.ShowWindow(nCmdShow);

 

    int nRet = theLoop.Run();

 

    _Module.RemoveMessageLoop();

 

    _Module.Term();

 

    return nRet;

}

                      


¡¡ÀÚ½Ä À©µµ¿ì¿ëÀÇUI°»½Å Çڵ鷯¸¦ »ç¿ëÇÏ·Á¸é ¿ì¼±  ¾ÆÀ̵é Çڵ鷯¿¡ ÀÚ½Ä À©µµ¿ì¿ëÀÇ UI°»½Å  Çڵ鷯ÀÎ UIUpdateChildWindows()¸¦ Ãß°¡ÇÕ´Ï´Ù.

¡¡´ÙÀ½¿¡ UI°»½Å Çڵ鷯 ¸ÊÀ¸·Î »óŸ¦ °»½ÅÇÏ´Â ÄÁÆ®·ÑÀÇ ÀÚ¿ø ID¿Í UIŸÀÔÀ» µî·ÏÇÕ´Ï´Ù. À̹ø  ¿¹¿¡¼­´Â [ĵ½½] ¹öưÀ» ÀÚ½Ä À©µµ¿ì¿ë UI°»½Å Çڵ鷯·Î °»½ÅÇϱ⠶§¹®¿¡ ÀÚ¿øID ¿¡´ÂIDCANCEL, UI ŸÀÔ¿¡´Â UPDUI_CHILDWINDOW¸¦ ÁöÁ¤ÇÕ´Ï´Ù.

¡¡OnInitDialog()¾È¿¡¼­´Â ÄÁÅ×À̳ʰ¡ µÇ´Â ´ÙÀ̾ó·Î±×ÀÇ ÇÚµéÀ» UIAddChildWindowContainer()¿¡ ÀÇÇØ UI °»½Å Çڵ鷯¿¡ Ãß°¡ÇÕ´Ï´Ù.  UI °»½Å Çڵ鷯¿¡¼­´Â  ¿©±â¼­ ÁöÁ¤µÈ ´ÙÀ̾ó·Î±×»óÀÇ ÄÁÆ®·Ñ¿¡ ´ëÇØ¼­ °»½Å 󸮸¦ ½Ç½ÃÇÕ´Ï´Ù.

¡¡¸¶Áö¸·À¸·Î OnMenuTopmost()¾È¿¡¼­ UIEnable()¸¦ »ç¿ëÇÏ´Â °Í¿¡ ÀÇÇØ  [ĵ½½] ¹öư »óŸ¦ ¹Ù²Ù°í ÀÖ½À´Ï´Ù.

¿©±â¼­ ÁÖÀÇÇÏÁö ¾ÊÀ¸¸é ¾È µÇ´Â °ÍÀº UIEnable()¸¦ È£ÃâÇÑ Á÷ÈÄ¿¡  [ĵ½½] ¹öư »óŰ¡ °»½ÅµÇ´Â °ÍÀÌ ¾Æ´Ï¶ó ¾îµð±îÁö³ª UIEnable()¸¦ È£ÃâÇÑ ÈÄ ÀÇ  ¾ÆÀÌµé ½Ã¿¡  UI°»½Å Çڵ鷯¿¡ ÀÇÇØ ÀÚµ¿ÀûÀ¸·Î °»½ÅµÈ´Ù°í ÇÏ´Â °ÍÀÔ´Ï´Ù.