¿©±â¿¡¼­´Â  ÀüȸÀÇ Åø¹Ù¸¦ Ãß°¡ÇÑ ¡¸Hello, ATL/WTL¡¹ÇÁ·Î±×·¥¿¡ ¸®¹ö¸¦ Ãß°¡ÇØ ±× ¸®¹öÀÇ ¹êµå¿¡ Åø¹Ù¸¦ °Ý³³ÇÕ´Ï´Ù. CFrameWindowImplŬ·¡½º¿¡´Â °£´ÜÇÑ ¸®¹ö¸¦ ÀÛ¼ºÇϱâ À§ÇÑ ¸â¹ö ÇÔ¼ö°¡ ÁغñµÇ¾î ÀÖ½À´Ï´Ù.

 

// 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:

    // À©µµ¿ì Ŭ·¡½º¸í , °øÅë ÀÚ¿øID, ½ºÅ¸ÀÏ , ¹è°æ»öÀ» µî·Ï

    DECLARE_FRAME_WND_CLASS_EX(_T("Hello"), IDR_MAINFRAME,

        CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS, COLOR_WINDOW)

 

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_HELLO, OnMenuHello)

        COMMAND_ID_HANDLER_EX(ID_MENUITEM_EXIT, OnMenuExit)

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

 

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

        CMessageLoop* pLoop = _Module.GetMessageLoop();

        pLoop->AddMessageFilter(this);

        pLoop->AddIdleHandler(this);

        return 0;

    }

 

    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;

}

                      


¡¡¿ì¼±  CMyWindowŬ·¡½ºOnCreate()Áß¿¡¼­  CreateSimpleReBar()¸¦ È£ÃâÇØ ¸®¹ö¸¦ ÀÛ¼ºÇÕ´Ï´Ù.

µ¡ºÙ¿© CreateSimpleReBar()¿¡´Â 2°³ÀÇ Àμö¸¦ °Ç³×ÁÙ ¼ö°¡ ÀÖ½À´Ï´Ù. Á¦1Àμö¿¡´Â ¸®¹öÀÇ ½ºÅ¸ÀÏÀ» ÁöÁ¤ÇÕ´Ï´Ù. µðÆúÆ® Àμö´ÂATL_SIMPLE_REBAR_STYLEÀÔ´Ï´Ù. ¸®¹öÀÇ ½ºÅ¸ÀÏÀº atlframe.hÇì´õ·Î ´ÙÀ½°ú °°ÀÌ Á¤Àǵǰí ÀÖ½À´Ï´Ù. µ¡ºÙ¿© Ç¥½Ã»óÀÇ »çÁ¤À¸·Î °³Çà À§Ä¡µîÀ» º¯°æÇϰí ÀÖ½À´Ï´Ù.

// atlframe.h³»

// standard rebar styles

#if (_WIN32_IE >= 0x0400)

#define ATL_SIMPLE_REBAR_STYLE \

    (WS_CHILD | WS_VISIBLE | WS_BORDER | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | \

    RBS_VARHEIGHT | RBS_BANDBORDERS | RBS_AUTOSIZE)

#else

#define ATL_SIMPLE_REBAR_STYLE \

    (WS_CHILD | WS_VISIBLE | WS_BORDER | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | \

    RBS_VARHEIGHT | RBS_BANDBORDERS)

#endif //!(_WIN32_IE >= 0x0400)

 

// rebar without borders

#if (_WIN32_IE >= 0x0400)

#define ATL_SIMPLE_REBAR_NOBORDER_STYLE \

    (WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | \

    RBS_VARHEIGHT | RBS_BANDBORDERS | RBS_AUTOSIZE | CCS_NODIVIDER)

#else

#define ATL_SIMPLE_REBAR_NOBORDER_STYLE \

    (WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | \

    RBS_VARHEIGHT | RBS_BANDBORDERS | CCS_NODIVIDER)

#endif //!(_WIN32_IE >= 0x0400)

                      


Á¦2Àμö¿¡´Â ½Äº°ÀÚ¸¦ ÁöÁ¤ÇÕ´Ï´Ù. µðÆúÆ® Àμö´ÂATL_IDW_TOOLBARÀÔ´Ï´Ù.

CreateSimpleReBar()Àº ³»ºÎ¿¡¼­CreateSimpleReBarCtrl()¶ó°í ÇÏ´Â ¸â¹ö ÇÔ¼ö¸¦ È£ÃâÇϰí ÀÖ¾î ±× È£Ãâ¿¡ ÀÇÇØ ¾òÀ» ¼ö ÀÖ´ø ¸®¹öÀÇ ÇÚµéÀ»  CFrameWindowImplŬ·¡½ºÀÇ base classÀÎ CFrameWindowImplBase Ŭ·¡½ºÀÇ m_hWndToolBarÀ̶ó°í ÇÏ´Â HWND ÇüÅÂÀÇ ¸â¹ö º¯¼ö¿¡ ´ëÀÔÇϰí ÀÖ½À´Ï´Ù.

¡¡´ÙÀ½¿¡  CreateSimpleToolBarCtrl()¸¦ È£ÃâÇØ Åø¹Ù¸¦ ÀÛ¼ºÇÕ´Ï´Ù.  CreateSimpleToolBarCtrl()ÀÇ Á¦1Àμö´Â ¸ÞÀÎ À©µµ¿ìÀÇ ÇÚµé , Á¦2Àμö´Â ÀÚ¿øID, Á¦3Àμö´Â Åø¹ÙÀÇ ¼±µÎ¿¡ separator¸¦ ¼³Á¤ÇÏ´ÂÁö ¾î¶²ÁöÀÇ Ç÷¡±× , Á¦4Àμö¿¡´Â Åø¹ÙÀÇ ½ºÅ¸ÀÏÀ» ÁöÁ¤ÇÕ´Ï´Ù. Á¦5Àμö¿¡´Â ½Äº°ÀÚ¸¦ ÁöÁ¤ÇÒ ¼ö ÀÖ½À´Ï´Ù¸¸  À̹øÀº »ý·« Çϰí ÀÖ½À´Ï´Ù. ¸®¹ö¿¡ ¹êµå ÇÏ´Â Åø¹ÙÀÇ °æ¿ì´Â  ½ºÅ¸ÀϷμ­ATL_SIMPLE_TOOLBAR_PANE_STYLE ¸¦ ÁöÁ¤ÇÕ´Ï´Ù. ÀÌ ½ºÅ¸ÀÏÀºatlframe.hÇì´õ·Î ´ÙÀ½°ú °°ÀÌ Á¤Àǵǰí ÀÖ½À´Ï´Ù.

// atlframe.h³»

// toolbar in a rebar pane

#define ATL_SIMPLE_TOOLBAR_PANE_STYLE \

    (WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | \

    CCS_NODIVIDER | CCS_NORESIZE | CCS_NOPARENTALIGN | TBSTYLE_TOOLTIPS | TBSTYLE_FLAT)

                      


¡¡´ÙÀ½¿¡  ÀÛ¼ºÇÑ Åø¹Ù¸¦ AddSimpleReBarBand()¿¡ ÀÇÇØ ¸®¹öÀÇ ¹êµå¿¡ Ãß°¡ÇÕ´Ï´Ù. À̹øÀº Á¦1Àμö·Î¼­ Åø¹ÙÀÇ ÇÚµé ¹Û¿¡ ÁöÁ¤ÇØ ÀÖ¾ú½À´Ï´Ù¸¸ , Á¦2Àμö¿¡´Â ŸÀÌÆ² , Á¦3Àμö¿¡´Â »õ·Î¿î Çà¿¡ µÎ´ÂÁö ¾î¶²ÁöÀÇ Ç÷¡±× , Á¦4Àμö¿¡´Â Æø , Á¦5Àμö¿¡´Â Æøº¸´Ù ÀÛ°Ô ÇÒ ¼ö ÀÖµµ·Ï ÇÏ´ÂÁö ¾î¶²ÁöÀÇ Ç÷¡±×¸¦ ¼³Á¤ÇÒ ¼ö ÀÖ½À´Ï´Ù.

¡¡_tWinMain()¿¡¼­ ¸®¹ö¸¦ ÃʱâÈ­Çϱâ À§Çؼ­ICC_COOL_CLASSESÇ÷¡±×¸¦ ÁöÁ¤Çß´ø AtlInitCommonControls()¸¦ È£ÃâÇÕ´Ï´Ù. AtlInitCommonControls()Àº Win32APIÀÇ InitCommonControlsEx()ÇÔ¼ö¸¦ ·¦ ÇÕ´Ï´Ù. À̹øÀº ÀÚÁÖ »ç¿ëµÈ´Ù°í »ý°¢µÇ´ÂICC_WIN95_CLASSESÇ÷¡±×µµ Ãß°¡ÇØ µÎ¾ú½À´Ï´Ù.