< Ä¿½ºÅÒ µå·Î¿ì >

Ä¿½ºÅÒ µå·Î¿ì¸¦
ÀÌ¿ëÇϸé Ä¿½ºÅÒ µå·Î¿ì¿¡ ´ëÀÀÇÑ ÄÁÆ®·ÑÀÇ ¿Ü°üÀ» Ä¿½ºÅÒ µå·Î¿ì º¸´Ù °£´ÜÇÏ°Ô Ä¿½ºÅÒ ¸¶ÀÌÁî ÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù.  WTLÀº Ä¿½ºÅÒ µå·Î¿ì¸¦ ¼­Æ÷Æ®Çϱâ À§Çؼ­ CCustomDrawŬ·¡½º¸¦ ÁغñÇØ ÀÖ½À´Ï´Ù.

¡¡
´ÙÀ½¿¡ ³ªÅ¸³»´Â °ÍÀº CCustomDraw Ŭ·¡½º¸¦ »ç¿ëÇØ  ½ºÆ®¶óÀÌÇÁÀÇ ¸®½ºÆ® ºä¸¦ ÀÛ¼ºÇÏ´Â ¿¹ÀÔ´Ï´Ù.

 

// stdafx.h

#include <atlbase.h>

#include <atlapp.h>

extern CAppModule _Module;

#include <atlwin.h>

 

#include <atlcrack.h>

#include <atlmisc.h>

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

                      

 

// maindlg.h

class CMainDlg : public CDialogImpl<CMainDlg>, public CCustomDraw<CMainDlg>

{

public:

    enum { IDD = IDD_MAINDLG };

 

    CListViewCtrl m_list_stripe;

 

    // ¸Þ¼¼Áö ¸Ê

    BEGIN_MSG_MAP_EX(CMainDlg)

        MSG_WM_INITDIALOG(OnInitDialog)

        COMMAND_ID_HANDLER_EX(IDOK, OnOK)

        COMMAND_ID_HANDLER_EX(IDCANCEL, OnCancel)

        CHAIN_MSG_MAP(CCustomDraw<CMainDlg>)    // CCustomDrawŬ·¡½º¿¡ üÀÎ

    END_MSG_MAP()

 

    DWORD OnPrePaint(int nID, LPNMCUSTOMDRAW lpnmcd){

        if(lpnmcd->hdr.idFrom == IDC_LIST_STRIPE)

            return CDRF_NOTIFYITEMDRAW;

        else

            return CDRF_DODEFAULT;

    }

 

    DWORD OnItemPrePaint(int nID, LPNMCUSTOMDRAW lpnmcd){

        if(lpnmcd->hdr.idFrom == IDC_LIST_STRIPE){

            LPNMLVCUSTOMDRAW lpnmlv = (LPNMLVCUSTOMDRAW)lpnmcd;

            if(lpnmcd->dwItemSpec % 2){

                lpnmlv->clrText = RGB(255, 255, 255);

                lpnmlv->clrTextBk = RGB(128, 128, 128);

            }

        }

        return CDRF_DODEFAULT;

    }

 

    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_stripe = GetDlgItem(IDC_LIST_STRIPE);

 

        m_list_stripe.SetExtendedListViewStyle(LVS_EX_INFOTIP | LVS_EX_FULLROWSELECT);

 

        CRect rcList;

        m_list_stripe.GetWindowRect(rcList);

        int nScrollWidth = GetSystemMetrics(SM_CXVSCROLL);

        int n3DEdge = GetSystemMetrics(SM_CXEDGE);

        m_list_stripe.InsertColumn(0, _T("À̸§"), LVCFMT_LEFT, 190, -1);

        m_list_stripe.InsertColumn(1, _T("Á¾·ù"), LVCFMT_LEFT,

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

 

        CFindFile find;

        if(find.FindFile()){

            do{

                if(!find.IsDots()){

                    int nIndex = m_list_stripe.GetItemCount();

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

                    m_list_stripe.AddItem(nIndex, 1,

                        find.IsDirectory() ? _T("Æú´õ") : _T("ÆÄÀÏ"));

                }

            }while(find.FindNextFile());

        }

 

        return TRUE;

    }

 

    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_STRIPE


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

¡¡
´ÙÀ½À¸·Î CMainDlg Ŭ·¡½ºÀÇ base class¿¡ CCustomDrawŬ·¡½º¸¦ Ãß°¡ÇØ  ¸Þ¼¼Áö ¸Ê¿¡ CCustomDrawŬ·¡½º¿¡ üÀÎÀ» Ãß°¡ÇÕ´Ï´Ù.  CCustomDraw Ŭ·¡½º´Â  ³»ºÎ¿¡ ´ÙÀ½°ú °°Àº ¸Þ¼¼Áö ¸ÊÀ» ÁغñÇØ ÀÖ½À´Ï´Ù.

// CCustomDrawŬ·¡½º

BEGIN_MSG_MAP(CCustomDraw< T >)

    NOTIFY_CODE_HANDLER(NM_CUSTOMDRAW, OnCustomDraw)

ALT_MSG_MAP(1)  // ¸Þ¼¼Áö ¸®Ç÷º¼Ç¿ë ´ëü ¸Þ¼¼Áö ¸Ê

    REFLECTED_NOTIFY_CODE_HANDLER(NM_CUSTOMDRAW, OnCustomDraw)

END_MSG_MAP()

                      


ÀÌ ¸Þ¼¼Áö ¸Ê¿¡¼­´Â  °á°úÀûÀ¸·ÎOnCustomDraw() ¸Þ¼¼Áö Çڵ鷯¸¦ È£ÃâÇÕ´Ï´Ù. ÀÌ Çڵ鷯¿¡¼­´Â NMCUSTOMDRAW ±¸Á¶Ã¼ÀÇ dwDrawStage ¸â¹öÀÇ °ª¿¡ ÀÇÇØ  ´ÙÀ½°ú °°Àº ¸â¹ö ÇÔ¼ö¸¦ È£ÃâÇÕ´Ï´Ù.

dwDrawStageÀÇ °ª

¸â¹ö ÇÔ¼ö¸í

CDDS_PREPAINT

OnPrePaint

CDDS_POSTPAINT

OnPostPaint

CDDS_PREERASE

OnPreErase

CDDS_POSTERASE

OnPostErase

CDDS_ITEMPREPAINT

OnItemPrePaint

CDDS_ITEMPOSTPAINT

OnItemPostPaint

CDDS_ITEMPREERASE

OnItemPreErase

CDDS_ITEMPOSTERASE

OnItemPostErase

CDDS_ITEMPREPAINT | CDDS_SUBITEM

OnSubItemPrePaint


CCustomDrawŬ·¡½º¿¡ÀÇ Ã¼Àο¡ ÀÇÇØ  Ä¿½ºÅÒ µå·Î¿ì°¡ ÇÊ¿äÇÑ Å¸Àֿ̹¡ ¸Þ½ÃÁö°¡ CCustomDraw Ŭ·¡½º¿¡ º¸³»Á® ÀÌ·¯ÇÑ ¸â¹ö ÇÔ¼ö°¡ ½ÇÇàµË´Ï´Ù. CCustomDrawŬ·¡½ºÀÇ »ó¼Ó Ŭ·¡½º(À§ÀÇ ¿¹¿¡¼­´ÂCMainDlgŬ·¡½º) ¿¡¼­´Â  ÀÌ·¯ÇÑ ¸â¹ö ÇÔ¼ö¸¦ ¿À¹ö¶óÀ̵å(override) ÇÏ´Â °Í¿¡ ÀÇÇØ ÄÁÆ®·Ñ¿¡ µ¶ÀÚÀûÀÎ ¿Ü°üÀ» ÁÝ´Ï´Ù.

CMainDlg Ŭ·¡½º¿¡¼­´Â ¿ì¼± OnPrePaint()À» ¿À¹ö¶óÀ̵å(override) ÇØ ÄÁÆ®·ÑÀÇ ID IDC_LIST_STRIPEÀÇ °æ¿ì¿¡´Â CDRF_NOTIFYITEMDRAWÀ» µ¹·ÁÁÝ´Ï´Ù. À̰Ϳ¡ ÀÇÇØ  ¸®½ºÆ® ºäÀÇ ¾ÆÀÌÅÛÀÌ ¹¦È­ µÇ´Â ŸÀֿ̹¡ Ä¿½ºÅÒ µå·Î¿ì¿ëÀÇ ¸Þ¼¼Áö°¡ º¸³»Á® ¿É´Ï´Ù.

´ÙÀ½¿¡ OnItemPrePaint()¸¦ ¿À¹ö¶óÀ̵å(override) ÇØ  ID¸¦ È®ÀÎÇÏ°í ³ª¼­  À妽º°¡ ¦¼öÀÇ ¾ÆÀÌÅÛÀÇ ¹®ÀÚ»ö°ú ¹è°æ»öÀ» ¼³Á¤ÇÕ´Ï´Ù.

¡¡
¸¶Áö¸·À¸·Î OnInitDialog() ±×¸®°í ¸®½ºÆ® ºä¿¡ ¾ÆÀÌÅÛÀ» ¼³Á¤ÇÕ´Ï´Ù.  Ä÷³À» 2°³ Ãß°¡ÇØ  ÇöÀç µð·ºÅ丮ÀÇ ÆÄÀϰú Æú´õ¸¦ ¾ÆÀÌÅÛÀ¸·Î¼­ ¸®½ºÆ® ºä¿¡ Ãß°¡ÇÕ´Ï´Ù.

¡¡
±×·±µ¥ CCustomDraw Ŭ·¡½º ³»ºÎÀÇ ¸Þ¼¼Áö ¸Ê¿¡´Â ¸Þ¼¼Áö ¸®Ç÷º¼Ç¿ëÀÇ ´ëü ¸Þ¼¼Áö ¸ÊÀÌ ÁغñµÇ¾î ÀÖ½À´Ï´Ù. ´ÙÀ½¿¡ ³ªÅ¸³»´Â °ÍÀº ¸Þ¼¼Áö ¸®Ç÷º¼ÇÀ» »ç¿ëÇÑ Ä¿½ºÅÒ µå·Î¿ìÀÇ ¹æ¹ýÀÔ´Ï´Ù.



¸Þ¼¼Áö ¸®Ç÷º¼Ç¿¡ ÀÇÇÑ Ä¿½ºÅÒ µå·Î¿ì

¡¡¸Þ¼¼Áö ¸®Ç÷º¼ÇÀ» ÀÌ¿ëÇÏ´Â °Í¿¡ ÀÇÇØ  ÄÁÆ®·Ñ Àڽſ¡°Ô Ä¿½ºÅÒ µå·Î¿ì ½Ãų ¼ö°¡ Àֱ⶧¹®¿¡  Àç»ç¿ë °¡´ÉÇÑ ÄÁÆ®·Ñ Ŭ·¡½º¸¦ ±â¼úÇϱ⠽¬¿öÁý´Ï´Ù.  ´ÙÀ½¿¡ ³ªÅ¸³»´Â °ÍÀº CCustomDraw Ŭ·¡½º¿Í ¸Þ¼¼Áö ¸®Ç÷º¼ÇÀ» ÀÌ¿ëÇØ ¾ÆÀÌÅÛÀ» ½ºÆ®¶óÀÌÇÁ Ç¥½ÃÇÏ´Â ¸®½ºÆ® ºä ÄÁÆ®·Ñ Ŭ·¡½º CStripeListViewCtrlÀÇ Á¤ÀÇÇÏ´Â ¿¹ÀÔ´Ï´Ù. ÀÌ ¿¹¿¡¼­´Â StripeListViewCtrl.hÀ̶ó°í ÇÏ´Â Çì´õ ÆÄÀÏÀ» ÁغñÇØ  °Å±â¿¡ CStripeListViewCtrlŬ·¡½º¸¦ Á¤ÀÇÇϰí ÀÖ½À´Ï´Ù.

// StripeListViewCtrl.h

class CStripeListViewCtrl : public CWindowImpl<CStripeListViewCtrl, CListViewCtrl>,

    public CCustomDraw<CStripeListViewCtrl>

{

public:

    DECLARE_WND_SUPERCLASS(_T("StripeListViewCtrl"), GetWndClassName())

 

    BEGIN_MSG_MAP_EX(CStripeListViewCtrl)

        CHAIN_MSG_MAP_ALT(CCustomDraw<CStripeListViewCtrl>, 1)

        DEFAULT_REFLECTION_HANDLER()

    END_MSG_MAP()

 

    DWORD OnPrePaint(int nID, LPNMCUSTOMDRAW lpnmcd){

        return CDRF_NOTIFYITEMDRAW;

    }

 

    DWORD OnItemPrePaint(int nID, LPNMCUSTOMDRAW lpnmcd){

        LPNMLVCUSTOMDRAW lpnmlv = (LPNMLVCUSTOMDRAW)lpnmcd;

        if(lpnmcd->dwItemSpec % 2){

            lpnmlv->clrText = RGB(255, 255, 255);

            lpnmlv->clrTextBk = RGB(128, 128, 128);

        }

 

        return CDRF_DODEFAULT;

    }

};

                      


ÀÌ CStripeListViewCtrlŬ·¡½º´Â CWindowImplŬ·¡½º¿Í CCustomDrawŬ·¡½º·ÎºÎÅÍ ÆÄ»ýÇϰí ÀÖ½À´Ï´Ù¸¸  CWindowImpl Ŭ·¡½ºÀÇ Á¦2ÅÛÇø´ Àμö¿¡´Â CListViewCtrlÀ» ÁöÁ¤ÇÕ´Ï´Ù. À̰Ϳ¡ ÀÇÇØ CStripeListViewCtrl Ŭ·¡½º´Â CListViewCtrlÀÇ »ó¼Ó Ŭ·¡½º°¡ µË´Ï´Ù.

CStripeListViewCtrl Ŭ·¡½º´Â ¹Ý¼ÛµÈ Ä¿½ºÅÒ µå·Î¿ì¿ë ¸Þ¼¼Áö¸¦  Ã¼Àο¡ ÀÇÇØ CCustomDraw Ŭ·¡½ºÀÇ ´ëü ¸Þ¼¼Áö ¸Ê¿¡ º¸³À´Ï´Ù.  CCustomDraw Ŭ·¡½º¿¡´Â ÀüÁ¦¿Í °°ÀÌ ¸â¹ö ÇÔ¼ö°¡ ÁغñµÇ¾î ÀÖ¾î CStripeListViewCtrlŬ·¡½º´Â ±× ÁßÀÇ OnPrePaint()°ú OnItemPrePaint() ¸¦ ¿À¹ö¶óÀ̵å(override) ÇØ ¸®½ºÆ® ºä ¾ÆÀÌÅÛÀ» ¹¦È­ Çϰí ÀÖ½À´Ï´Ù.

¡¡
´ÙÀ½¿¡ ÀÌ CStripeListViewCtrlŬ·¡½º¸¦ »ç¿ëÇØ ¾ÕÀÇ ½ºÆ®¶óÀÌÇÁ ¸®½ºÆ® ºäÀÇ ÇÁ·Î±×·¥À» º¯°æÇÏ´Â ¿¹¸¦ ³ªÅ¸³À´Ï´Ù.

// stdafx.h

#include <atlbase.h>

#include <atlapp.h>

extern CAppModule _Module;

#include <atlwin.h>

 

#include <atlcrack.h>

#include <atlmisc.h>

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

                      

 

// maindlg.h

class CMainDlg : public CDialogImpl<CMainDlg>

{

public:

    enum { IDD = IDD_MAINDLG };

 

    CStripeListViewCtrl m_list_stripe;

 

    // ¸Þ¼¼Áö ¸Ê

    BEGIN_MSG_MAP_EX(CMainDlg)

        MSG_WM_INITDIALOG(OnInitDialog)

        COMMAND_ID_HANDLER_EX(IDOK, OnOK)

        COMMAND_ID_HANDLER_EX(IDCANCEL, OnCancel)

        REFLECT_NOTIFICATIONS()

    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_stripe.SubclassWindow(GetDlgItem(IDC_LIST_STRIPE));

 

        m_list_stripe.SetExtendedListViewStyle(LVS_EX_INFOTIP | LVS_EX_FULLROWSELECT);

 

        CRect rcList;

        m_list_stripe.GetWindowRect(rcList);

        int nScrollWidth = GetSystemMetrics(SM_CXVSCROLL);

        int n3DEdge = GetSystemMetrics(SM_CXEDGE);

        m_list_stripe.InsertColumn(0, _T("À̸§"), LVCFMT_LEFT, 190, -1);

        m_list_stripe.InsertColumn(1, _T("Á¾·ù"), LVCFMT_LEFT,

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

 

        CFindFile find;

        if(find.FindFile()){

            do{

                if(!find.IsDots()){

                    int nIndex = m_list_stripe.GetItemCount();

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

                    m_list_stripe.AddItem(nIndex, 1,

                        find.IsDirectory() ? _T("Æú´õ") : _T("ÆÄÀÏ"));

                }

            }while(find.FindNextFile());

        }

 

        return TRUE;

    }

 

    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 "StripeListViewCtrl.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;

}

                      


¡¡
¿ì¼± CMainDlg Ŭ·¡½º¿¡ CStripeListViewCtrlŬ·¡½ºÀÇ ÀνºÅϽº¸¦ ¸â¹ö º¯¼ö·Î¼­ ¼±¾ðÇÕ´Ï´Ù. À̰͵éÀº OnInitDialog()À¸·Î ¼­ºê Ŭ·¡½ºÈ­ÇÕ´Ï´Ù. ¼­ºê Ŭ·¡½ºÈ­ÇÑ ÈÄ¿¡ ¸®½ºÆ® ºä¿¡ ¾ÆÀÌÅÛÀ» ¼³Á¤ÇÕ´Ï´Ù. ±×¸®°í  ¸Þ¼¼Áö ¸Ê¿¡´Â ¸Þ¼¼Áö ¸®Ç÷º¼ÇÀ» À§Çؼ­ REFLECT_NOTIFICATIONS ¸ÅÅ©·Î¸¦ Ãß°¡ÇÕ´Ï´Ù.

¡¡
¸¶Áö¸·À¸·Î Control.cpp ÆÄÀÏ ³»¿¡¼­ StripeListViewCtrl.h Çì´õ¸¦ Æ÷ÇÔ ÇÕ´Ï´Ù.