< Æ®¸® ºä >

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

// atlctrls.h

typedef CTreeViewCtrlT<ATL::CWindow>   CTreeViewCtrl;

                      


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

¡¡WTL
ÀÇ CTreeViewCtrlŬ·¡½º´Â MFCÀÇ CTreeCtrlŬ·¡½º¿Í µ¿µîÀÇ ±â´ÉÀ» °®Ãß°í ÀÖ´Â °Í ¿Ü¿¡ È®Àå ±â´Éµµ °®Ãß°í ÀÖ½À´Ï´Ù. ÀÌÇÏ¿¡ ³ªÅ¸³»´Â °ÍÀº CTreeViewCtrlŬ·¡½º¸¦ »ç¿ëÇÏ´Â ¿¹ ÀÔ´Ï´Ù. Æ®¸® ºä ÄÁÆ®·ÑÀÇ ¾ÆÀÌÅÛÀ» Ŭ¸¯ÇÏ¸é ±× ¾ÆÀÌÅÛ¿¡ °üÇÑ Á¤º¸¸¦ static ÄÁÆ®·Ñ¿¡ Ç¥½ÃÇÕ´Ï´Ù.

 

// stdafx.h

#include <atlbase.h>

#include <atlapp.h>

extern CAppModule _Module;

#include <atlwin.h>

 

#include <atlcrack.h>

#include <atlmisc.h>

#include <atlctrls.h>  // ÄÁÆ®·Ñ¿ë Ŭ·¡½º¸¦ »ç¿ëÇϱâ À§ÇØ

                      

 

// maindlg.h

class CMainDlg : public CDialogImpl<CMainDlg>

{

public:

    enum { IDD = IDD_MAINDLG };

 

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

   

    CTreeViewCtrl m_tree_sysinfo;

    CStatic m_static_display;        // Á¤º¸ Ç¥½Ã¿ë

 

    // ¸Þ¼¼Áö ¸Ê

    BEGIN_MSG_MAP_EX(CMainDlg)

        MSG_WM_INITDIALOG(OnInitDialog)

        NOTIFY_HANDLER_EX(IDC_TREE_SYSINFO, NM_CLICK, OnTreeClick)

        COMMAND_ID_HANDLER_EX(IDOK, OnOK)

        COMMAND_ID_HANDLER_EX(IDCANCEL, OnCancel)

    END_MSG_MAP()

 

    LRESULT OnInitDialog(HWND hWnd, LPARAM lParam){

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

        CenterWindow();

 

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

        HICON hIcon = AtlLoadIconImage(IDR_MAINFRAME, LR_DEFAULTCOLOR,

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

        SetIcon(hIcon, TRUE);

       

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

        HICON hIconSmall = AtlLoadIconImage(IDR_MAINFRAME, LR_DEFAULTCOLOR,

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

        SetIcon(hIconSmall, FALSE);

 

        // ÄÁÆ®·Ñ ¼³Á¤

        m_tree_sysinfo = GetDlgItem(IDC_TREE_SYSINFO);

        m_static_display = GetDlgItem(IDC_STATIC_DISPLAY);

 

        HTREEITEM hSysInfo =

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

 

        HTREEITEM hDllVer =

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

 

        HTREEITEM hItem;

 

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

        m_tree_sysinfo.SetItemData(hItem, SHELL);

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

        m_tree_sysinfo.SetItemData(hItem, COMCTL);

 

        HTREEITEM hSysDir =

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

 

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

        m_tree_sysinfo.SetItemData(hItem, WINDIR);

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

        m_tree_sysinfo.SetItemData(hItem, SYSDIR);

 

        return TRUE;

    }

 

    LRESULT OnTreeClick(LPNMHDR pnmh){

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

        UINT uFlag;

        CPoint pt = ::GetMessagePos();

        m_tree_sysinfo.ScreenToClient(&pt);

        HTREEITEM hItem = m_tree_sysinfo.HitTest(pt, &uFlag);

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

            return 0;

 

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

        CString strInfo;

        DWORD dwData = m_tree_sysinfo.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;

        }

        m_static_display.SetWindowText(strInfo);

 

        return 0;

    }

 

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

        EndDialog(nID);

    }

 

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

        EndDialog(nID);

    }

};

                      

 

// Control.cpp

#include "stdafx.h"

 

#include "resource.h"

 

#include "maindlg.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: ¾îÇø®ÄÉÀÌ¼Ç ½ÇÇà

    {

        CMainDlg dlgMain;

        nRet = dlgMain.DoModal();

    }

 

    _Module.Term();

    ::CoUninitialize();

 

    return nRet;

}

                      


¡¡
¿ì¼±  ÀÚ¿øÀ» ÀÛ¼ºÇÕ´Ï´Ù. ´ÙÀ̾ó·Î±×¿¡ Æ®¸® ºä ÄÁÆ®·Ñ°ú ½ºÅÂÆ½ ÄÁÆ®·ÑÀ» ¹èÄ¡ÇØ ÀÚ¿øID¸¦ ´ÙÀ½°ú °°ÀÌ ÁöÁ¤ÇÕ´Ï´Ù. µ¡ºÙ¿© Æ®¸® ºä ÄÁÆ®·ÑÀÇ [½ºÅ¸ÀÏ]¿¡¼­´Â µðÆúÆ®¿¡´Ù°¡ [¹öư ÀÖÀ½], [¼±À» Ç¥½Ã],  [ÃÖ»óÁ¤µµ¿¡µµ ¼±À» Ç¥½Ã]¿¡ üũ¸¦ ³Ö½À´Ï´Ù.

ÄÁÆ®·Ñ¸í

ÀÚ¿øID

Æ®¸®ºä

IDC_TREE_SYSINFO

½ºÅÂÆ½

IDC_STATIC_DISPLAY


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

¡¡
CMainDlgŬ·¡½º¿¡¼­´Â ¿ì¼± enum¿¡ ÀÇÇØ Æ®¸® ¾ÆÀÌÅÛÀ» ½Äº°Çϱâ À§ÇÑ ¼öÄ¡¸¦ Á¤ÀÇÇÕ´Ï´Ù. ´ÙÀ½¿¡ Æ®¸® ºä ÄÁÆ®·Ñ¿ëÀ¸·Î CTreeViewCtrlŬ·¡½º  ½ºÅÂÆ½ ÄÁÆ®·Ñ¿ëÀ¸·Î CStatic Ŭ·¡½ºÀÇ ÀνºÅϽº¸¦ ¸â¹ö º¯¼ö·Î¼­ ¼±¾ðÇÕ´Ï´Ù. À̰͵éÀ» »ç¿ëÇϱâ À§Çؼ­´Â WM_INITDIALOG ¸Þ¼¼Áö Çڵ鷯·Î ÄÁÆ®·ÑÀÇ ÇÚµéÀ» ´ëÀÔÇÒ Çʿ䰡 ÀÖ½À´Ï´Ù.

¡¡
´ÙÀ½¿¡ WM_INITDIALOG ¸Þ¼¼Áö Çڵ鷯·Î Æ®¸® ºä ÄÁÆ®·Ñ¿¡ ¾ÆÀÌÅÛÀ» »ðÀÔÇÕ´Ï´Ù. ¿©±â¼­ ¹æ±Ý Àü enum¿¡ ÀÇÇØ Á¤ÀÇÇÑ ½Äº°ÀÚ¸¦SetItemData()·Î ¾ÆÀÌÅÛÀ¸·Î ¼³Á¤ÇÕ´Ï´Ù. ¼³Á¤ÇÏÁö ¾Ê´Â °æ¿ì´Â InsertItem() ±×¸®°í ¾ÆÀÌÅÛÀ» »ðÀÔÇßÀ» ¶§¿¡ ÀÌ¹Ì 0 ÀÌ ¼³Á¤µÇ¾î ÀÖ½À´Ï´Ù. (ÀÌ ¶§¹®¿¡  ½Äº°ÀÚ¿¡´Â 0 Àܸ̿¦ »ç¿ëÇϰí ÀÖ½À´Ï´Ù. )

¡¡
´ÙÀ½¿¡ , ÅëÁö Äڵ尡NM_CLICKÀÇ Æ®¸®ºäÄÜÆ®·Î¸£¿ë ÅëÁö ¸Þ¼¼Áö Çڵ鷯¸¦ Ãß°¡ÇÕ´Ï´Ù. ±× Çڵ鷯¿¡¼­´Â Ŭ¸¯µÈ ¾ÆÀÌÅÛÀÇ ½Äº°ÀÚ¸¦ ÃëµæÇØ , ±× °ª¿¡ µû¶ó Á¤º¸¸¦ ½ºÅÂÆ½ ÄÁÆ®·Ñ¿¡ Ç¥½ÃÇϰí ÀÖ½À´Ï´Ù.