< Æ®¸® ºä >

ÀÌÇÏ¿¡
³ªÅ¸³»´Â °ÍÀº  Æ®¸®ºä ÄÁÆ®·ÑÀ» º£À̽º·Î ÇÑ ºä À©µµ¿ì¸¦ ÀÛ¼ºÇÏ´Â ¿¹ÀÔ´Ï´Ù. ºä À©µµ¿ì¿¡´Â ¾ÆÀÌÅÛÀ» Ãß°¡ÇÏ¿© ¾ÆÀÌÅÛÀ» ´õºí Ŭ¸¯ ÇÏ¸é ±× ¾ÆÀÌÅÛ¿¡ °üÇÑ Á¤º¸¸¦ ¸Þ½ÃÁö ¹Ú½º¿¡ Ç¥½ÃÇÕ´Ï´Ù.

 

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

                      

 

// view.h

class CTreeView : public CWindowImpl<CTreeView, CTreeViewCtrl>

{

public:

    DECLARE_WND_SUPERCLASS(NULL, CTreeViewCtrl::GetWndClassName())

 

    BOOL PreTranslateMessage(MSG* pMsg){

        return FALSE;

    }

 

private:

    enum {SHELL = 1, COMCTL, WINDIR, SYSDIR}; // Æ®¸® ¾ÆÀÌÅÛ ½Äº°ÀÚ

 

    // ¸Þ¼¼Áö ¸Ê

    BEGIN_MSG_MAP_EX(CTreeView)

        MSG_WM_CREATE(OnCreate)

        REFLECTED_NOTIFY_CODE_HANDLER_EX(NM_DBLCLK, OnTreeDblClick)

        DEFAULT_REFLECTION_HANDLER()

    END_MSG_MAP()

 

    LRESULT OnCreate(LPCREATESTRUCT lpcs){

        LRESULT lRet = DefWindowProc();

 

        SetFont(AtlGetDefaultGuiFont());

 

        // Æ®¸®ºä¿¡ ¾ÆÀÌÅÛ »ðÀÔ

        HTREEITEM hSysInfo =

            InsertItem(_T("½Ã½ºÅÛ Á¤º¸"), TVI_ROOT, TVI_LAST);

 

        HTREEITEM hDllVer =

            InsertItem(_T("DLL¹öÁ¯"), hSysInfo, TVI_LAST);

 

        HTREEITEM hItem;

 

        hItem = InsertItem(_T("shell32.dll"), hDllVer, TVI_LAST);

        SetItemData(hItem, SHELL);

        hItem = InsertItem(_T("comctl32.dll"), hDllVer, TVI_LAST);

        SetItemData(hItem, COMCTL);

 

        HTREEITEM hSysDir =

            InsertItem(_T("µð·ºÅ丮"), hSysInfo, TVI_LAST);

 

        hItem = InsertItem(_T("Windows"), hSysDir, TVI_LAST);

        SetItemData(hItem, WINDIR);

        hItem = InsertItem(_T("½Ã½ºÅÛ"), hSysDir, TVI_LAST);

        SetItemData(hItem, SYSDIR);

 

        return lRet;

    }

 

    LRESULT OnTreeDblClick(LPNMHDR pnmh){

        // Ŭ¸¯µÈ ¾ÆÀÌÅÛ ÇÚµé Ãëµæ

        UINT uFlag;

        CPoint pt = ::GetMessagePos();

        ScreenToClient(&pt);

        HTREEITEM hItem = HitTest(pt, &uFlag);

        if(hItem == NULL || !(uFlag & TVHT_ONITEM))

            return 0;

 

        // ¾ÆÀÌÅÛ µ¥ÀÌÅÍ Ãëµæ

        CString strInfo;

        DWORD dwData = GetItemData(hItem);

        switch(dwData){

        case SHELL:

        {

            // shell32.dllÀÇ ¹öÁ¯ Ãëµæ

            DWORD dwMajor, dwMinor;

            AtlGetShellVersion(&dwMajor, &dwMinor);

            strInfo.Format(_T("Version %d.%02d"), dwMajor, dwMinor);

            break;

        }

        case COMCTL:

        {

            // comctl32.dllÀÇ ¹öÁ¯ Ãëµæ

            DWORD dwMajor, dwMinor;

            AtlGetCommCtrlVersion(&dwMajor, &dwMinor);

            strInfo.Format(_T("Version %d.%02d"), dwMajor, dwMinor);

            break;

        }

        case WINDIR:

        {

            // WindowsÆú´õ ÆÐ½º Ãëµæ

            TCHAR szPath[MAX_PATH];

            GetWindowsDirectory(szPath, MAX_PATH);

            strInfo = szPath;

            break;

        }

        case SYSDIR:

        {

            // ½Ã½ºÅÛ Æú´õ ÆÐ½º Ãëµæ

            TCHAR szPath[MAX_PATH];

            GetSystemDirectory(szPath, MAX_PATH);

            strInfo = szPath;

            break;

        }

        default:

            break;

        }

 

        if(!strInfo.IsEmpty())

            MessageBox(strInfo, _T("¾ÆÀÌÅÛ"));

 

        return 0;

    }

};

                      

 

// mainfrm.h

class CMainFrame : public CFrameWindowImpl<CMainFrame>,

    public CUpdateUI<CMainFrame>, public CMessageFilter, public CIdleHandler

{

public:

    DECLARE_FRAME_WND_CLASS(NULL, IDR_MAINFRAME)

 

    CTreeView m_view;

 

    virtual BOOL PreTranslateMessage(MSG* pMsg){

        if(CFrameWindowImpl<CMainFrame>::PreTranslateMessage(pMsg))

            return TRUE;

 

        return m_view.PreTranslateMessage(pMsg);

    }

 

    virtual BOOL OnIdle(){

        UIUpdateStatusBar();

        return FALSE;

    }

 

    BEGIN_UPDATE_UI_MAP(CMainFrame)

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

    END_UPDATE_UI_MAP()

 

    BEGIN_MSG_MAP_EX(CMainFrame)

        MSG_WM_CREATE(OnCreate)

        COMMAND_ID_HANDLER_EX(ID_APP_EXIT, OnMenuExit)

        CHAIN_MSG_MAP(CUpdateUI<CMainFrame>)

        CHAIN_MSG_MAP(CFrameWindowImpl<CMainFrame>)

        CHAIN_CLIENT_COMMANDS()    // ºäÅ©¶ó½º¿¡ Ä¿¸àµå üÀÎ

        REFLECT_NOTIFICATIONS()    // ¸Þ¼¼Áö ¸®Ç÷º¼Ç

    END_MSG_MAP()

 

    LRESULT OnCreate(LPCREATESTRUCT lpcs){

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

        CreateSimpleStatusBar();

        UIAddStatusBar(m_hWndStatusBar);

 

        // ºä¸¦ ÀÛ¼º

        m_hWndClient = m_view.Create(m_hWnd, rcDefault, NULL,

            WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN |

            TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_SHOWSELALWAYS,

            WS_EX_CLIENTEDGE);

 

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

        CMessageLoop* pLoop = _Module.GetMessageLoop();

        pLoop->AddMessageFilter(this);

        pLoop->AddIdleHandler(this);

 

        return 0;

    }

 

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

        PostMessage(WM_CLOSE);

    }

};

                      

 

// app.cpp

#include "stdafx.h"

 

#include "resource.h"

 

#include "view.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;

}

                      


¡¡
¿ì¼± stdafx.h ¿¡¼­´Â  ÄÁÆ®·Ñ¿ë Ŭ·¡½º¸¦ »ç¿ëÇϱâ À§Çؼ­ atlctrls.h Çì´õ¸¦ ÀÎŬ·çµå ÇÕ´Ï´Ù.

¡¡
´ÙÀ½¿¡ ºä À©µµ¿ì¸¦ À§ÇÑ Å¬·¡½º¸¦ Á¤ÀÇÇÕ´Ï´Ù. À§ÀÇ ¿¹¿¡¼­´Â ÇÁ·ÎÁ§Æ®¿¡ view.h ¶ó°í ÇÏ´Â Çì´õ ÆÄÀÏÀ» Ãß°¡ÇÏ¿© °Å±â¿¡ CWindowImpl Ŭ·¡½º·ÎºÎÅÍ ÆÄ»ýÇÑ CTreeView ¶ó°í Çϴ Ŭ·¡½º¸¦ Á¤ÀÇÇϰí ÀÖ½À´Ï´Ù. CWindowImpl Ŭ·¡½ºÀÇ Á¦2Àμö¿¡´Â º£À̽º°¡ µÇ´ÂCTreeViewCtrl Ŭ·¡½º¸¦ ÁöÁ¤ÇÕ´Ï´Ù.

¡¡
CTreeView Ŭ·¡½º ³»¿¡¼­´Â ¿ì¼± WM_CREATE ¸Þ¼¼Áö Çڵ鷯¸¦ Ãß°¡ÇÏ¿© óÀ½¿¡DefWindowProc()¸¦ È£ÃâÇÏ°í ³ª¼­ µðÆúÆ®ÀÇ GUI ÆùÆ®¸¦ ¼³Á¤ÇØ ºä¿¡ Æ®¸® ¾ÆÀÌÅÛÀ» »ðÀÔÇÕ´Ï´Ù.

¡¡
´ÙÀ½¿¡ ÅëÁö Äڵ尡 NM_DBLCLKÀÇ ÅëÁö ¸Þ¼¼Áö Çڵ鷯¸¦ Ãß°¡ÇÕ´Ï´Ù. ¿©±â¿¡¼­´Â ¼±Åõǰí ÀÖ´Â ¾ÆÀÌÅÛ¿¡ °ü·Ã ÁöÀ» ¼ö ÀÖ¾ú´ø ¼öÄ¡¿¡ ÀÇÇØ ÀûÀýÇÑ ½Ã½ºÅÛ Á¤º¸¸¦ ÃëµæÇÏ¿© ¸Þ½ÃÁö ¹Ú½º·Î Ç¥½ÃÇϰí ÀÖ½À´Ï´Ù. µ¡ºÙ¿© ÀÌ ÇÔ¼ö´Â ¸Þ¼¼Áö ¸®Ç÷º¼Ç¿¡ ÀÇÇØ ºÒ·Á °©´Ï´Ù.

¡¡
À̹ø ¿¹¿¡¼­´Â ºä À©µµ¿ìÀÇ º£À̽º·Î¼­ CTreeViewCtrl Ŭ·¡½º¸¦ »ç¿ëÇß½À´Ï´Ù¸¸  WTLÀÌ Æ®¸®ºä ÄÁÆ®·ÑÀ» À§Çؼ­ ÁغñÇØ ÀÖ´Â CTreeViewCtrlEx Ŭ·¡½º¸¦ »ç¿ëÇÒ ¼öµµ ÀÖ½À´Ï´Ù.