< üũ ¸®½ºÆ® ºä >

üũ ¸®½ºÆ® ºä´Â
üũ ¹Ú½º ÷ºÎÀÇ  ¸®½ºÆ® ºä ÄÁÆ®·ÑÀÔ´Ï´Ù.  WTLÀº üũ ¸®½ºÆ® ºä¸¦ ÀÛ¼ºÇϱâ À§Çؼ­ CCheckListViewCtrl¶ó°í Çϴ Ŭ·¡½º¸¦ ÁغñÇØ ÀÖ½À´Ï´Ù.

CCheckListViewCtrlŬ·¡½º´Â CListViewCtrlŬ·¡½º·ÎºÎÅÍ ÆÄ»ýÇϰí ÀÖ¾î µðÆúÆ®·Î LVS_EX_CHECKBOXES½ºÅ¸ÀÏÀÌ ¼³Á¤µÇ¾î ÀÖ½À´Ï´Ù. ÀÌÇÏ¿¡ ³ªÅ¸³»´Â °ÍÀº CCheckListViewCtrlŬ·¡½º¸¦ »ç¿ëÇÏ´Â ¿¹ÀÔ´Ï´Ù.

 

// stdafx.h

#include <atlbase.h>

#include <atlapp.h>

extern CAppModule _Module;

#include <atlwin.h>

 

#include <atlcrack.h>

#include <atlmisc.h>

#include <atlctrls.h>

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

                      

 

// maindlg.h

class CMainDlg : public CDialogImpl<CMainDlg>

{

public:

    enum { IDD = IDD_MAINDLG };

 

    CCheckListViewCtrl m_list_dir;     // üũ¸®½ºÆ®ºä

 

    // ¸Þ¼¼Áö ¸Ê

    BEGIN_MSG_MAP_EX(CMainDlg)

        MSG_WM_INITDIALOG(OnInitDialog)

        COMMAND_ID_HANDLER_EX(IDC_BUTTON_COUNT, OnButtonCount)

        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_list_dir.SubclassWindow(GetDlgItem(IDC_LIST_DIR));

 

        // üũ¸®½ºÆ®ºä¿¡ Ä÷³ ¼³Á¤

        CRect rcList;

        m_list_dir.GetWindowRect(rcList);

        int nScrollWidth = GetSystemMetrics(SM_CXVSCROLL);

        int n3DEdge = GetSystemMetrics(SM_CXEDGE);

        m_list_dir.InsertColumn(0, _T("À̸§"), LVCFMT_LEFT,

            rcList.Width() - nScrollWidth - n3DEdge * 2, -1);

 

        // üũ¸®½ºÆ®ºä¿¡ ¾ÆÀÌÅÛ Ãß°¡

        CFindFile find;

        if(find.FindFile()){

            do{

                if(!find.IsDots()){

                    int nIndex = m_list_dir.GetItemCount();

                    m_list_dir.AddItem(nIndex, 0, find.GetFileName());

                }

            }while(find.FindNextFile());

        }

 

        return TRUE;

    }

 

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

        int nCheckedCount = 0;

        int nCount = m_list_dir.GetItemCount();

        for(int i=0; i<nCount; i++){

            if(m_list_dir.GetCheckState(i))

                nCheckedCount++;

        }

        CString strMsg;

        strMsg.Format(_T("üũµÈ ¾ÆÀÌÅÛ¼ö£º%d"), nCheckedCount);

        MessageBox(strMsg);

    }

 

    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_LIST_DIR

Ǫ½¬ ¹öư

IDC_BUTTON_COUNT


¡¡
CMainDlgŬ·¡½º¿¡¼­´Â ¿ì¼± CCheckListViewCtrl Ŭ·¡½ºÀÇ  ÀνºÅϽº¸¦ ¸â¹ö º¯¼ö·Î¼­ ¼±¾ðÇÕ´Ï´Ù. À̰ÍÀ» »ç¿ëÇϱâ À§Çؼ­´Â WM_INITDIALOG ¸Þ¼¼Áö Çڵ鷯·Î ¼­ºê Ŭ·¡½ºÈ­ ÇÒ Çʿ䰡 ÀÖ½À´Ï´Ù.

¡¡
´ÙÀ½¿¡ WM_INITDIALOG ¸Þ¼¼Áö Çڵ鷯¿¡¼­´Â üũ ¸®½ºÆ® ºä¿¡ ÇöÀç µð·ºÅ丮 ³»ÀÇ Æú´õ¿Í ÆÄÀÏÀ» ¾ÆÀÌÅÛÀ¸·Î¼­ Ãß°¡ÇÕ´Ï´Ù.

¡¡
¸¶Áö¸·À¸·Î ¸®¼Ò½º ID°¡ IDC_BUTTON_COUNTÀÇ Ä¿¸àµå ¸Þ¼¼Áö Çڵ鷯·Î¼­ OnButtonCount()¸¦ Ãß°¡ÇÕ´Ï´Ù. ÀÌ Çڵ鷯 ¿¡¼­´Â üũ ¸®½ºÆ® ºä Áß¿¡¼­ üũµÇ°í ÀÖ´Â ¾ÆÀÌÅÛÀ» Ä«¿îÆ® ÇØ ±×°ÍÀ» ¸Þ½ÃÁö ¹Ú½º¸¦ Ç¥½ÃÇϰí ÀÖ½À´Ï´Ù.

¡¡
±×·±µ¥ À§ÀÇ ¿¹ ¿¡¼­´Â üũ ¸®½ºÆ® ºä¸¦ ÀÛ¼ºÇϱâ À§Çؼ­ ´ÙÀ̾ó·Î±× »ó¿¡ ÄÁÆ®·Ñ ÀÚ¿øÀ» ¹èÄ¡ÇØ ¼­ºê Ŭ·¡½ºÈ­ Çß½À´Ï´Ù¸¸ Create()À» »ç¿ëÇØ ÀÛ¼ºÇÒ ¼öµµ ÀÖ½À´Ï´Ù.

m_list_dir.Create(m_hWnd, CRect(0, 0, 200, 100), NULL, 0, 0, IDC_LIST_DIR);

                      


¼­ºê Ŭ·¡½ºÈ­¿¡ ÀÇÇØ ÀÛ¼ºÇßÀ» °æ¿ì´Â ÀÚ¿øÀÇ ÇÁ·ÎÆÛƼ¿¡ ÀÇÇØ ½ºÅ¸ÀÏ([¸®Æ÷Æ®]³ª[¼±ÅÃÀ» Ç×»ó Ç¥½Ã]) À» ¼³Á¤Çß½À´Ï´Ù¸¸ Create()À» »ç¿ëÇØ ÀÛ¼ºÇßÀ» °æ¿ì´Â ½ºÅ¸ÀÏÀ» Á¦4Àμö(À©µµ¿ì ½ºÅ¸ÀÏ),  Á¦5Àμö(È®Àå À©µµ¿ì ½ºÅ¸ÀÏ)¿¡ ÀÇÇØ ¼³Á¤ÇÕ´Ï´Ù. ÀÌ·¯ÇÑ Àμö¿¡ 0 ¸¦ ÁöÁ¤ÇßÀ» °æ¿ì´Â µðÆúÆ®ÀÇ À©µµ¿ì Ư¼ºÀ¸·Î¼­ CCheckListViewCtrlTraits Ŭ·¡½º°¡ »ç¿ëµË´Ï´Ù.  CCheckListViewCtrlTraits Ŭ·¡½º´Â atlctrlx.h Çì´õ ³»¿¡¼­ ´ÙÀ½°ú °°ÀÌ ¼±¾ðµÇ°í ÀÖ½À´Ï´Ù.

template <DWORD t_dwStyle, DWORD t_dwExStyle, DWORD t_dwExListViewStyle>

class CCheckListViewCtrlImplTraits

{

public:

    static DWORD GetWndStyle(DWORD dwStyle)

    {

        return (dwStyle == 0) ? t_dwStyle : dwStyle;

    }

 

    static DWORD GetWndExStyle(DWORD dwExStyle)

    {

        return (dwExStyle == 0) ? t_dwExStyle : dwExStyle;

    }

 

    static DWORD GetExtendedLVStyle()

    {

        return t_dwExListViewStyle;

    }

};

 

typedef CCheckListViewCtrlImplTraits<WS_CHILD | WS_VISIBLE |

    LVS_REPORT | LVS_SHOWSELALWAYS, WS_EX_CLIENTEDGE,

    LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT>  CCheckListViewCtrlTraits;

                      


CCheckListViewCtrlImplTraits Ŭ·¡½º´Â ATLÀÇ CWinTraits Ŭ·¡½º¿Í ´Þ¸®  À©µµ¿ì ½ºÅ¸ÀÏ, È®Àå À©µµ¿ì ½ºÅ¸ÀÏ¿¡ ´õÇØ È®Àå ¸®½ºÆ® ºä ½ºÅ¸Àϵµ ¼³Á¤ÇÕ´Ï´Ù.

CCheckListViewCtrlŬ·¡½º´Â ´ÙÀ½°ú °°ÀÌ Á¤Àǵǰí ÀÖ½À´Ï´Ù.

// atlctrlx.h

// CCheckListViewCtrlŬ·¡½ºÀÇ base class

template <class T, class TBase = CListViewCtrl,

    class TWinTraits = CCheckListViewCtrlTraits>

class ATL_NO_VTABLE CCheckListViewCtrlImpl :

    public ATL::CWindowImpl<T, TBase, TWinTraits>

{

    ...

    ...

};

 

class CCheckListViewCtrl : public CCheckListViewCtrlImpl<CCheckListViewCtrl>

{

public:

    DECLARE_WND_SUPERCLASS(_T("WTL_CheckListView"), GetWndClassName())

};

                      


ÀÌ ¶§¹®¿¡ Ä¿½ºÅÒ ¸¶ÀÌÁî ÇÑ CCheckListViewCtrlImplTraits Ŭ·¡½º¸¦ CCheckListViewCtrlImplŬ·¡½ºÀÇ Á¦3ÅÛÇø´ Àμö·Î ÁöÁ¤ÇÏ¸é µ¶ÀÚÀûÀÎ ½ºÅ¸ÀÏÀÇ Ã¼Å© ¸®½ºÆ® ºä ÄÁÆ®·ÑÀ» ÀÛ¼ºÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù.  ´ÙÀ½¿¡ ³ªÅ¸³»´Â °ÍÀº È®Àå ¸®½ºÆ® ºä ½ºÅ¸ÀϷμ­ LVS_EX_INFOTIP ½ºÅ¸ÀÏÀ» °¡Áø µ¶ÀÚÀûÀΠüũ ¸®½ºÆ® ºä ÄÁÆ®·Ñ Ŭ·¡½º¸¦ Á¤ÀÇÇÏ´Â ¿¹ ÀÔ´Ï´Ù.

typedef CCheckListViewCtrlImplTraits<WS_CHILD | WS_VISIBLE |

    LVS_REPORT | LVS_SHOWSELALWAYS, WS_EX_CLIENTEDGE,

    LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT | LVS_EX_INFOTIP>  CMyTraits;

 

class CMyCheckListViewCtrl :

    public CCheckListViewCtrlImpl<CMyCheckListViewCtrl, CListViewCtrl, CMyTraits>

{

public:

    DECLARE_WND_SUPERCLASS(_T("MyCheckListView"), GetWndClassName())

};

                      


µ¡ºÙ¿© LVS_EX_INFOTIP¿Í °°Àº È®Àå ¸®½ºÆ® ºä ½ºÅ¸ÀÏÀ» º¯°æÇÑ´Ù¸é  SetExtendedListViewStyle()À» »ç¿ëÇÒ ¼öµµ ÀÖ½À´Ï´Ù. ÀÌ ¶§  Ã¼Å© ¸®½ºÆ® ºä ÄÁÆ®·Ñ·Î ÇʼöÀÇ LVS_EX_CHECKBOXES ½ºÅ¸Àϵµ µ¿½Ã¿¡ ÁöÁ¤ÇÕ´Ï´Ù.

CCheckListViewCtrl m_list;

...

...

m_list.SetExtendedListViewStyle(

    LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT | LVS_EX_INFOTIP);