< Åø¹Ù >

WTL¿¡¼­ °ø¿ë ÄÁÆ®·ÑÀÇ Åø¹Ù ÄÁÆ®·ÑÀ» CToolBarCtrlT  ¶ó°í ÇÏ´Â ÅÛÇø´ Ŭ·¡½º¿¡¼­ ĸ½¶È­Çϰí ÀÖ½À´Ï´Ù. ÅÛÇø´ Àμö¿¡´Â Ŭ·¡½º¸¦ ÁöÁ¤ÇÕ´Ï´Ù¸¸  ±× Ŭ·¡½º´Â CToolBarCtrlT Ŭ·¡½ºÀÇ base class·Î¼­ »ç¿ëµË´Ï´Ù.  atlctrls.h Çì´õ¿¡¼­´Â typedef¿¡ ÀÇÇØ ´ÙÀ½°ú °°ÀÌ ¼±¾ðµÇ°í ÀÖ½À´Ï´Ù.

// atlctrls.h

typedef CToolBarCtrlT<ATL::CWindow>   CToolBarCtrl;

                      


À̰ÍÀº CToolBarCtrlŬ·¡½º´Â CWindow Ŭ·¡½ºÀÇ »ó¼Ó Ŭ·¡½ºÀÎ °ÍÀ» ÀǹÌÇÕ´Ï´Ù.

¡¡WTL
ÀÇ CToolBarCtrlŬ·¡½º´Â MFCÀÇ µ¿¸íÀÇ Å¬·¡½º¿Í °ÅÀÇ °°Àº ¸â¹ö ÇÔ¼ö¸¦ ÁغñÇØ ÀÖ½À´Ï´Ù. ÀÌÇÏ¿¡ ³ªÅ¸³»´Â °ÍÀº CToolBarCtrlŬ·¡½º¸¦ »ç¿ëÇÏ´Â ¿¹ÀÔ´Ï´Ù. ÇÁ·¹ÀÓ À©µµ¿ì¸¦ ÀÛ¼ºÇØ Åø¹Ù¸¦ Ãß°¡ÇØ Åø¹Ù À§ÀÇ ÃÖÃÊÀÇ ¹öưÀ» µå·Ó ´Ù¿î ½ºÅ¸ÀÏ·Î ÇÕ´Ï´Ù.

 

// stdafx.h

#include <atlbase.h>

#include <atlapp.h>

extern CAppModule _Module;

#include <atlwin.h>

 

#include <atlcrack.h>

#include <atlmisc.h>

#include <atlctrls.h>

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

 

    virtual BOOL PreTranslateMessage(MSG* pMsg){

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

    }

 

    virtual BOOL OnIdle(){

        UIUpdateToolBar();

        return FALSE;

    }

 

    BEGIN_UPDATE_UI_MAP(CMainFrame)

        // ¿£Æ®¸® ¾øÀ½

    END_UPDATE_UI_MAP()

 

    BEGIN_MSG_MAP_EX(CMainFrame)

        MSG_WM_CREATE(OnCreate)

        NOTIFY_CODE_HANDLER_EX(TBN_DROPDOWN, OnToolbarDropdown)

        COMMAND_ID_HANDLER_EX(ID_BUTTON_MSG, OnButtonMsg)

        COMMAND_ID_HANDLER_EX(ID_MENUITEM_HELLOATL, OnMenuHelloATL)

        COMMAND_ID_HANDLER_EX(ID_MENUITEM_HELLOWTL, OnMenuHelloWTL)

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

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

        CreateSimpleToolBar();

        UIAddToolBar(m_hWndToolBar);

 

        // Åø¹ÙÀÇ ½ºÅ¸ÀÏ º¯°æ

        CToolBarCtrl bar = m_hWndToolBar;

        bar.SetStyle(bar.GetStyle() | TBSTYLE_FLAT);

        bar.SetExtendedStyle(TBSTYLE_EX_DRAWDDARROWS);

 

        // Åø¹Ù»óÀÇ ¹öưÀÇ ½ºÅ¸ÀÏÀ» º¯°æ

        TBBUTTONINFO bi = {sizeof(bi), TBIF_STYLE};

        bar.GetButtonInfo(ID_BUTTON_MSG, &bi);

        bi.fsStyle |= TBSTYLE_DROPDOWN;

        bar.SetButtonInfo(ID_BUTTON_MSG, &bi);

 

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

        CMessageLoop* pLoop = _Module.GetMessageLoop();

        pLoop->AddMessageFilter(this);

        pLoop->AddIdleHandler(this);

 

        return 0;

    }

 

    LRESULT OnToolbarDropdown(LPNMHDR pnmh){

        LPNMTOOLBAR pnmtb = (LPNMTOOLBAR)pnmh;

        if(pnmtb->iItem == ID_BUTTON_MSG){

            CToolBarCtrl bar = pnmtb->hdr.hwndFrom;

 

            // µå·Ó ´Ù¿î ¸Þ´º¸¦ Ç¥½ÃÇÏ´Â À§Ä¡¸¦ Ãëµæ

            CRect rcButton;

            bar.GetRect(ID_BUTTON_MSG, rcButton);

            bar.MapWindowPoints(HWND_DESKTOP, rcButton);

 

            TPMPARAMS tpm = {sizeof(tpm)};

            tpm.rcExclude = rcButton;

 

            // µå·Ó ´Ù¿î ¸Þ´º Ç¥½Ã

            CMenu menuDropdown;

            menuDropdown.LoadMenu(IDR_MENU_DROPDOWN);

            menuDropdown.GetSubMenu(0).TrackPopupMenuEx(

                TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_VERTICAL,

                rcButton.left, rcButton.bottom, m_hWnd, &tpm);

        }

 

        return TBDDRET_DEFAULT;

    }

 

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

        MessageBox(_T("Hello World"));

    }

 

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

        MessageBox(_T("Hello ATL"));

    }

 

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

        MessageBox(_T("Hello WTL"));

    }

 

    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;

}

                      


¡¡
¿ì¼± ÇÁ·ÎÁ§Æ®¿¡ IDR_MAINFRAME ¶ó°í ÇÏ´Â IDÀÇ Åø¹Ù ¸®¼Ò½º¸¦ Ãß°¡ÇÏ°í ´ÙÀ½°ú °°Àº ¹öưÀ» Ãß°¡ÇÕ´Ï´Ù. ¹öư ID´Â ID_BUTTON_MSGÀ¸·Î ÇÕ´Ï´Ù.



°Ô´Ù°¡ µå·Ó ´Ù¿î¿ëÀÇ ¸Þ´º ÀÚ¿øÀ» Ãß°¡ÇÕ´Ï´Ù. ¸Þ´º ¸®¼Ò½º ID´Â IDR_MENU_DROPDOWNÀ¸·Î Çϰí Åé ·¹º§¿¡ [index0]¸¦ ±× ¾Æ·¡¿¡ [Hello ATL]¸Þ´º ¾ÆÀÌÅÛ°ú [Hello WTL] ¸Þ´º ¾ÆÀÌÅÛÀ» Ãß°¡ÇÕ´Ï´Ù. [Hello ATL] ¸Þ´º ¾ÆÀÌÅÛ¿¡´ÂID_MENUITEM_HELLOATL, [Hello WTL] ¸Þ´º ¾ÆÀÌÅÛ¿¡´ÂID_MENUITEM_HELLOWTL ¶ó°í ÇÏ´ÂIDÀ» ¼³Á¤ÇÕ´Ï´Ù.



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

¡¡
CMainFrameŬ·¡½º¿¡¼­´Â ÀϹÝÀûÀÎ ÇÁ·¹ÀÓ À©µµ¿ì¸¦ ÀÛ¼ºÇÕ´Ï´Ù. WM_CREATE¸Þ¼¼Áö Çڵ鷯·Î ¿ì¼± CreateSimpleToolBar()À» È£ÃâÇØ Åø¹Ù¸¦ ÀÛ¼ºÇÕ´Ï´Ù. À̰Ϳ¡ ÀÇÇØ ÇÁ·¹ÀÓ À©µµ¿ìÀÇ ¸â¹ö º¯¼öÀÎ m_hWndToolBar¿¡ Åø¹ÙÀÇ ÇÚµéÀÌ ¼³Á¤µË´Ï´Ù. ´ÙÀ½¿¡ CToolBarCtrl Ŭ·¡½ºÀÇ ÀνºÅϽº¸¦ ÀÌ Åø¹ÙÀÇ ÇÚµé·Î ÃʱâÈ­ Çϰí Åø¹ÙÀÇ ½ºÅ¸ÀÏÀ» º¯°æÇÕ´Ï´Ù. ¿©±â¿¡¼­´Â Åø¹Ù »óÀÇ µå·Ó ´Ù¿î ¹öư¿¡ È­»ìÇ¥¸¦ Ãß°¡Çϱâ À§ÇØ  TBSTYLE_EX_DRAWDDARROWS ½ºÅ¸ÀÏÀ» ¼³Á¤ÇÕ´Ï´Ù. ±×¸®°í ID°¡ ID_BUTTON_MSGÀÇ ¹öư¿¡ µå·Ó ´Ù¿î ½ºÅ¸ÀÏÀ» Ãß°¡ÇÕ´Ï´Ù.

¡¡
´ÙÀ½À¸·Î ÅëÁö Äڵ尡 TBN_DROPDOWNÀÇ ÅëÁö ¸Þ¼¼Áö Çڵ鷯¸¦ Ãß°¡ÇÕ´Ï´Ù. ÀÌ Çڵ鷯´Â µå·Ó ´Ù¿î ¹öưÀÇ È­»ìÇ¥ ºÎºÐÀ» Ŭ¸¯ÇÒ ¶§¸¶´Ù ºÒ·Á °©´Ï´Ù. ¿©±â¿¡¼­´Â ¹öư ID¸¦ È®ÀÎÇÏ°í µå·Ó ´Ù¿î ¸Þ´º¸¦ Ç¥½ÃÇϰí ÀÖ½À´Ï´Ù.

¡¡
´ÙÀ½À¸·Î Ä¿¸àµå ¸Þ¼¼Áö Çڵ鷯¸¦ Ãß°¡ÇÕ´Ï´Ù. OnButtonMsg()´Â µå·Ó ´Ù¿î ¹öưÀ» ´­·¶À» ¶§¿¡ ºÒ·ÁÁö´Â OnMenuHelloATL()¿ÍOnMenuHelloWTL()´Â µå·Ó ´Ù¿î ¸Þ´º Ç׸ñÀ» ½ÇÇàÇßÀ» ¶§¿¡ ºÒ·Á Áý´Ï´Ù. ÀÌ·¯ÇÑ Çڵ鷯 ¿¡¼­´Â ¸Þ½ÃÁö ¹Ú½º¸¦ Ç¥½ÃÇϰí ÀÖÀ» »ÓÀÔ´Ï´Ù.

¡¡
¸¶Áö¸·À¸·Î _tWinMain() ¿¡¼­ ICC_WIN95_CLASSES Ç÷¡±×¸¦ ÁöÁ¤ÇØ AtlInitCommonControls()¸¦ È£ÃâÇÕ´Ï´Ù. À̰Ϳ¡ ÀÇÇØ Åø¹Ù ÄÁÆ®·ÑÀÌ »ç¿ë °¡´ÉÇÏ°Ô µË´Ï´Ù.