< Ä¿¸Çµå ¹Ù >

Ä¿¸Çµå
¹Ù¶õ InternetExplorerÀÇ µµ±¸ ¸ðÀ½°ú °°Àº ±×¸³ÀÌ ºÙ¾î ÀÖ¾î À̵¿ °¡´ÉÇÑ ¹ÙÀÔ´Ï´Ù.  WTLÀº  Ä¿¸Çµå ¹Ù¸¦ ÀÛ¼ºÇϱâ À§Çؼ­ CCommandBarCtrlŬ·¡½º¸¦ ÁغñÇØ ÀÖ½À´Ï´Ù.  CCommandBarCtrlŬ·¡½º¸¦ »ç¿ëÇÏ¸é  ¸Þ´º ¸®¼Ò½º¸¦ ÁغñÇÏ´Â °Í ¸¸À¸·Î °£´ÜÇÏ°Ô Ä¿¸Çµå ¹Ù¸¦ ÀÛ¼ºÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù. ±×¸®°í  È­»ó ¸®¼Ò½º¸¦ ÁغñÇÏ¸é ¸Þ´º ¾ÆÀÌÅÛ¿¡ È­»óÀ» °ü·Ã ÁöÀ» ¼ö°¡ ÀÖ½À´Ï´Ù. (µ¡ºÙ¿© È­»óÀº CCommandBarCtrlŬ·¡½ºÀÇ ¸â¹ö ÇÔ¼öÀÎ SetImagesVisible(false)À» È£ÃâÇÏ´Â °Í¿¡ ÀÇÇØ ºñ Ç¥½Ã·Î ÇÒ ¼öµµ ÀÖ½À´Ï´Ù. )


°Ô´Ù°¡ Ä¿¸Çµå ¹ÙÀÇ Ç¥½Ã ÆøÀÌ ºÎÁ·ÇÑ °æ¿ì¿¡¼­µµ ÀÚµ¿ÀûÀ¸·Î ¼Îºê·Ð(>>¸¶Å©) ÀÌ À¯È¿ÇÏ°Ô µË´Ï´Ù.


¹°·Ð º¸Åë µµ±¸ ¸ðÀ½°ú °°ÀÌ »óÅ ¹Ù¿¡ ÇöóÀÌ¹Ù ÅØ½ºÆ® (¸Þ´º ¾ÆÀÌÅÛ»ó¿¡ Ä¿¼­¸¦ µÎ¾úÀ» ¶§¿¡ »óÅ ¹Ù¿¡ Ç¥½ÃµÇ´Â ÅØ½ºÆ®) ¸¦ Ç¥½ÃÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù.


CCommandBarCtrl Ŭ·¡½º´Â CToolBarCtrlŬ·¡½ºÀÇ »ó¼Ó Ŭ·¡½ºÀÔ´Ï´Ù.  WTL¿¡¼­ µµ±¸¸ðÀ½ À¸·Î °¡ÀåÇÑ Åø¹Ù¸¦ ¸®¹öÀÇ ¹êµå¿¡ Ãß°¡ÇÏ´Â °Í¿¡ ÀÇÇØ Ä¿¸Çµå ¹Ù¸¦ ÀÛ¼ºÇÕ´Ï´Ù.

¡¡
ÀÌÇÏ¿¡ ³ªÅ¸³»´Â °ÍÀº CCommandBarCtrlŬ·¡½º¸¦ »ç¿ëÇÏ´Â ¿¹ÀÔ´Ï´Ù. ÇÁ·¹ÀÓ À©µµ¿ì¸¦ ÀÛ¼ºÇØ Ä¿¸Çµå ¹Ù¸¦ Ãß°¡ÇÕ´Ï´Ù. µ¡ºÙ¿© ¼³¸íÀÇ ÇüÆí»ó  Åø¹Ù¿Í »óÅ ¹Ùµµ Ãß°¡ÇØ  Åø¹Ù´Â Ç¥½Ã/ºñÇ¥½Ã¸¦ º¯È¯µÇµµ·Ï ÇÕ´Ï´Ù.

// stdafx.h

#include <atlbase.h>

#include <atlapp.h>

extern CAppModule _Module;

#include <atlwin.h>

 

#include <atlcrack.h>

#include <atlmisc.h>

#include <atlctrls.h>

#include <atlctrlw.h>  // CCommandBarCtrlŬ·¡½º¸¦ »ç¿ëÇϱâ À§ÇØ

#include <atlframe.h>

                      

 

// mainfrm.h

class CMainFrame : public CFrameWindowImpl<CMainFrame>,

    public CUpdateUI<CMainFrame>, public CMessageFilter, public CIdleHandler

{

public:

    DECLARE_FRAME_WND_CLASS(NULL, IDR_MAINFRAME)

 

    CCommandBarCtrl m_wndCmdBar;

 

    virtual BOOL PreTranslateMessage(MSG* pMsg){

        return CFrameWindowImpl<CMainFrame>::PreTranslateMessage(pMsg);

    }

 

    virtual BOOL OnIdle(){

        UIUpdateToolBar();

        UIUpdateStatusBar();

        return FALSE;

    }

 

    BEGIN_UPDATE_UI_MAP(CMainFrame)

        UPDATE_ELEMENT(ID_MENUITEM_TOOLBAR, UPDUI_MENUPOPUP)

    END_UPDATE_UI_MAP()

 

    BEGIN_MSG_MAP_EX(CMainFrame)

        MSG_WM_CREATE(OnCreate)

        COMMAND_ID_HANDLER_EX(ID_MENUITEM_TOOLBAR, OnMenuToolbar)

        COMMAND_ID_HANDLER_EX(ID_APP_EXIT, OnMenuExit)

        CHAIN_MSG_MAP(CUpdateUI<CMainFrame>)

        CHAIN_MSG_MAP(CFrameWindowImpl<CMainFrame>)

    END_MSG_MAP()

 

    LRESULT OnCreate(LPCREATESTRUCT lpcs){

        // ÄÚ¸Çµå ¹Ù¸¦ ÀÛ¼º

        HWND hWndCmdBar = m_wndCmdBar.Create(m_hWnd,

            rcDefault, NULL, ATL_SIMPLE_CMDBAR_PANE_STYLE);

 

        // ±âÁ¸ÀÇ µµ±¸¸ðÀ½À» ¾ÆÅ¿Ä¡

        m_wndCmdBar.AttachMenu(GetMenu());

        // ¸Þ´º ¾ÆÀÌÅÛ¿¡ °ü·ÃÁöÀ» ¼ö ÀÖ¾ú´ø Åø¹ÙÀÇ È­»óÀ» ·Îµå

        m_wndCmdBar.LoadImages(IDR_MAINFRAME);

        // ±âÁ¸ÀÇ µµ±¸¸ðÀ½À» »èÁ¦

        SetMenu(NULL);

 

        // Åø¹Ù¸¦ ÀÛ¼º

        HWND hWndToolBar = CreateSimpleToolBarCtrl(m_hWnd,

            IDR_MAINFRAME, FALSE, ATL_SIMPLE_TOOLBAR_PANE_STYLE);

        UIAddToolBar(hWndToolBar);

 

        // ¸®¹ö¸¦ ÀÛ¼ºÇØ , ÄÚ¸Çµå ¹Ù¿Í Åø¹Ù¸¦ ¹êµå¿¡ Ãß°¡

        CreateSimpleReBar(ATL_SIMPLE_REBAR_NOBORDER_STYLE);

        AddSimpleReBarBand(hWndCmdBar);

        AddSimpleReBarBand(hWndToolBar, NULL, TRUE);

 

        // »óÅ ¹Ù¸¦ ÀÛ¼º

        CreateSimpleStatusBar();

        UIAddStatusBar(m_hWndStatusBar);

 

        UISetCheck(ID_MENUITEM_TOOLBAR, true);

 

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

        CMessageLoop* pLoop = _Module.GetMessageLoop();

        pLoop->AddMessageFilter(this);

        pLoop->AddIdleHandler(this);

 

        return 0;

    }

 

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

        static BOOL bVisible = TRUE;

        bVisible = !bVisible;

        CReBarCtrl rebar = m_hWndToolBar;

        int nBandIndex = rebar.IdToIndex(ATL_IDW_BAND_FIRST + 1);

        rebar.ShowBand(nBandIndex, bVisible);

        UISetCheck(ID_MENUITEM_TOOLBAR, bVisible);

        UpdateLayout();

    }

 

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

        PostMessage(WM_CLOSE);

    }

};

                      

 

// app.cpp

#include "stdafx.h"

 

#include "resource.h"

 

#include "mainfrm.h"

 

CAppModule _Module;

 

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

{

    HRESULT hRes = ::CoInitialize(NULL);

    ATLASSERT(SUCCEEDED(hRes));

 

    ::DefWindowProc(NULL, 0, 0, 0L);

 

    AtlInitCommonControls(ICC_COOL_CLASSES | ICC_WIN95_CLASSES);

 

    hRes = _Module.Init(NULL, hInstance);

    ATLASSERT(SUCCEEDED(hRes));

 

    int nRet = 0;

    // BLOCK: ¾îÇø®ÄÉÀÌ¼Ç ½ÇÇà

    {

        CMessageLoop theLoop;

        _Module.AddMessageLoop(&theLoop);

 

        CMainFrame wnd;

        wnd.CreateEx();

        wnd.ShowWindow(nCmdShow);

        wnd.UpdateWindow();

 

        nRet = theLoop.Run();

 

        _Module.RemoveMessageLoop();

    }

 

    _Module.Term();

    ::CoUninitialize();

 

    return nRet;

}

                      


¡¡
¿ì¼±  µµ±¸ ¸ðÀ½ ÀÚ¿øÀÇ Åé ·¹º§¿¡ [Ç¥½Ã]¸¦ ÀÛ¼ºÇØ ±× ¾Æ·¡¿¡ [Åø¹Ù] ¸Þ´º ¾ÆÀÌÅÛÀ» Ãß°¡ÇÕ´Ï´Ù. ÀÌ [Åø¹Ù]¿¡´ÂID_MENUITEM_TOOLBAR À̶ó°í ÇÏ´ÂIDÀ» ¼³Á¤ÇÕ´Ï´Ù.



¡¡
´ÙÀ½¿¡ stdafx.h ¿¡¼­´Â CCommandBarCtrlŬ·¡½º¸¦ »ç¿ëÇϱâ À§Çؼ­ atlctrlw.h Çì´õ¸¦ Æ÷ÇÔ ÇÕ´Ï´Ù.

¡¡
CMainFrame Ŭ·¡½º¿¡¼­´Â ÀϹÝÀûÀÎ ÇÁ·¹ÀÓ À©µµ¿ì¸¦ ÀÛ¼ºÇÕ´Ï´Ù.  CMainFrameŬ·¡½ºÀÇ ¸â¹ö º¯¼ö·Î¼­ CCommandBarCtrl Ŭ·¡½ºÀÇ ÀνºÅϽº¸¦ ¼±¾ðÇØ WM_CREATE ¸Þ¼¼Áö Çڵ鷯·Î Create() ¸¦ È£ÃâÇÏ´Â °Í¿¡ ÀÇÇØ Ä¿¸Çµå ¹Ù¸¦ ÀÛ¼ºÇÕ´Ï´Ù. ÀÌCreate()ÀÇ ÀμöÀÇ Àǹ̴ CWindowImpl::Create()°ú °°¾Æ ¿©±â¿¡¼­´Â À©µµ¿ì ½ºÅ¸ÀÏ¿¡ ATL_SIMPLE_CMDBAR_PANE_STYLE¸¦ ÁöÁ¤ÇØ ÀÖ½À´Ï´Ù. ÀÌ ½ºÅ¸ÀÏÀº atlctrlw.h Çì´õ ³»¿¡¼­ ´ÙÀ½°ú °°ÀÌ Á¤Àǵǰí ÀÖ½À´Ï´Ù. µ¡ºÙ¿© Ç¥½Ã»óÀÇ »çÁ¤À¸·Î °³Çà À§Ä¡µîÀ» º¯°æÇϰí ÀÖ½À´Ï´Ù.

// atlctrlw.h

// Window Styles:

#define CBRWS_TOP            CCS_TOP

#define CBRWS_BOTTOM         CCS_BOTTOM

#define CBRWS_NORESIZE       CCS_NORESIZE

#define CBRWS_NOPARENTALIGN  CCS_NOPARENTALIGN

#define CBRWS_NODIVIDER      CCS_NODIVIDER

 

// standard command bar styles

#define ATL_SIMPLE_CMDBAR_PANE_STYLE \

    (WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | \

    CBRWS_NODIVIDER | CBRWS_NORESIZE | CBRWS_NOPARENTALIGN)

                      


Ä¿¸Çµå ¹Ù¸¦ ÀÛ¼ºÇÑ ÈÄ´Â  Ä¿¸Çµå ¹Ù¿¡ ¸Þ´º ¾ÆÀÌÅÛÀ» Ãß°¡ÇÕ´Ï´Ù. À§ÀÇ ¿¹¿¡¼­´ÂAttachMenu()À» È£ÃâÇÏ´Â °Í¿¡ ÀÇÇØ ÇÁ·¹ÀÓ À©µµ¿ìÀÇ µµ±¸ ¸ðÀ½À¸·ÎºÎÅÍ ¸Þ´º ¾ÆÀÌÅÛÀ» ÀоîµéÀ̰í ÀÖ½À´Ï´Ù¸¸  LoadMenu()À» È£ÃâÇØ ¸Þ´º ¸®¼Ò½º·ÎºÎÅÍ Á÷Á¢ ¾ÆÀÌÅÛÀ» ·ÎµåÇÒ ¼öµµ ÀÖ½À´Ï´Ù.

// ÄÚ¸Çµå ¹Ù¸¦ ÀÛ¼º

HWND hWndCmdBar = m_wndCmdBar.Create(m_hWnd,

    rcDefault, NULL, ATL_SIMPLE_CMDBAR_PANE_STYLE);

 

// ¸Þ´º ÀÚ¿øÀ» ·Îµå

m_wndCmdBar.LoadMenu(IDR_MAINFRAME);

                      


´ÙÀ½¿¡ LoadImages()¸¦ È£ÃâÇÏ´Â °Í¿¡ ÀÇÇØ Åø¹ÙÀÇ È­»óÀ» ·ÎµåÇϰí ÀÖ½À´Ï´Ù. À̰Ϳ¡ ÀÇÇØ ID°¡ µ¿ÀÏÇÑ ¸Þ´º ¾ÆÀÌÅÛ°ú Åø¹ÙÀÇ È­»óÀ» °ü·ÃÁöÀ» ¼ö ÀÖ¾î ¸Þ´º ¾ÆÀÌÅÛÀÇ ¿·¿¡ È­»óÀÌ Ç¥½ÃµÇ°Ô µË´Ï´Ù. µ¡ºÙ¿© ¸Þ´º ¾ÆÀÌÅÛÀÇ ¿·¿¡ È­»óÀ» Ç¥½ÃÇϱâ À§Çؼ­´Â AddBitmap()À̳ªAddIcon()¸¦ »ç¿ëÇÒ ¼öµµ ÀÖ½À´Ï´Ù.

´ÙÀ½À¸·Î Åø¹Ù¿Í ¸®¹ö¸¦ ÀÛ¼ºÇØ ¹êµå¿¡ Ä¿¸Çµå ¹Ù¿Í  Åø¹Ù¸¦ Ãß°¡ÇÕ´Ï´Ù. Åø¹Ù´Â Ä¿¸Çµå ¹Ù ¾Æ·¡¿¡ Ãß°¡Çϱ⠶§¹®¿¡  AddSimpleReBarBandÀÇ Á¦3Àμö¿¡´ÂTRUE¸¦ ÁöÁ¤ÇÕ´Ï´Ù.

¡¡
¸¶Áö¸·À¸·Î ¸Þ´º ¾ÆÀÌÅÛ [Åø¹Ù](ID£ºID_MENUITEM_TOOLBAR) ¿ëÀÇ Ä¿¸àµå ¸Þ¼¼Áö Çڵ鷯¸¦ Ãß°¡ÇÕ´Ï´Ù. ÀÌ Çڵ鷯¿¡¼­´Â Á¤Àû º¯¼ö bVisible¿¡ ÀÇÇØ Åø¹ÙÀÇ °¡½Ã »óŸ¦ º¸°ü À¯ÁöÇØ CReBarCtrlŬ·¡½ºÀÇ ¸â¹ö ÇÔ¼öÀÎ ShowBand()À¸·Î °¡½Ã »óŸ¦ »õ·Î ¹Ù²Ù°í ÀÖ½À´Ï´Ù. µ¡ºÙ¿© ÀÌ Çڵ鷯ÀÇ ÄÚµå´Â ATL/WTL AppWizard ÀÌ Ãâ·ÂÇÏ´Â °Í°ú °ÅÀÇ °°½À´Ï´Ù.



Ä¿¸Çµå ¹Ù ½ºÅ¸ÀÏÀÇ  pop-up menu

¡¡Åë»óÀÇ ¸Þ´º°¡ CMenu::TrackPopupMenu()¸¦ È£ÃâÇÏ´Â °Í¿¡ ÀÇÇØ pop-up ÇÒ ¼ö ÀÖµµ·Ï  Ä¿¸Çµå ¹Ù ½ºÅ¸ÀÏÀÇ ¸Þ´ºµµ CCommandBarCtrl::TrackPopupMenu()¸¦ È£ÃâÇÏ´Â °Í¿¡ ÀÇÇØ pop-up ÇÒ ¼ö ÀÖ½À´Ï´Ù.


ÀÌÇÏ¿¡ ³ªÅ¸³»´Â °ÍÀº Ä¿¸Çµå ¹Ù ½ºÅ¸ÀÏÀÇ  pop-up menu¸¦ Ç¥½ÃÇÏ´Â ÄÚµåÀÇ ¿¹ÀÔ´Ï´Ù. ÀüÁ¦ÀÇ ÇÁ·Î±×·¥¿¡ ÀÌÇÏÀÇ Äڵ带 Ãß°¡ÇÏ´Â °ÍÀ¸·Î½á Ŭ¶óÀÌ¾ðÆ® ¿µ¿ªÀ» ¿À¸¥ÂÊ Å¬¸¯ÇßÀ» ¶§¿¡ À妽º 0 ÀÇ Ä¿¸Çµå ¹Ù ¸Þ´º ¾ÆÀÌÅÛ( [ÆÄÀÏ] ÀÌÇÏ ) ÀÌ pop-up menu·Î¼­ Ç¥½ÃµË´Ï´Ù.

// mainfrm.h

BEGIN_MSG_MAP_EX(CMainFrame)

    MSG_WM_CONTEXTMENU(OnContextMenu)

    ...

    ...

END_MSG_MAP()

 

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

        // ÄÚ¸Çµå ¹ÙÀÇ ¸Þ´º ÇÚµéÀ» Ãëµæ

        CMenuHandle menu = m_wndCmdBar.GetMenu();

 

        // À妽º0ÀÇ ¸Þ´º ¾ÆÀÌÅÛÀ» pop-up menu·Î¼­ Ç¥½Ã

        m_wndCmdBar.TrackPopupMenu(menu.GetSubMenu(0),

            TPM_LEFTALIGN | TPM_TOPALIGN | TPM_LEFTBUTTON, pt.x, pt.y, NULL);

    }else{

        SetMsgHandled(false);

    }

}

                      


ÀÌ¿Í °°ÀÌ  pop-up menu¸¦ Ä¿¸Çµå ¹Ù ½ºÅ¸ÀϷΠǥ½ÃÇϱâ À§Çؼ­´Â CCommandBarCtrl::TrackPopupMenu()ÀÇ  Á¦1Àμö¿¡ Ç¥½ÃÇÏ´Â ¸Þ´ºÀÇ ÇÚµéÀ» ÁöÁ¤ÇÕ´Ï´Ù.