10. µå·¡±× ¿Í µå·Ó(Drag & Drop)

10.1 Ä÷³ ¼ø¼­¸¦ ¹Ù²Ù±âÀ§ÇØ Ä÷³ µå·¡±ëÇϱâ

Á¾Á¾ ¸®½ºÆ®ºä ÄÁÆ®·Ñ¿¡ Á¦°øµÇ´Â È­¸é°ø°£Àº ÄÁÆ®·ÑÀÇ ¸ðµç Ä÷³µéÀ» º¸¿©Áֱ⿡´Â ºÎÁ·ÇÒ¶§°¡ ¸¹½À´Ï´Ù. ¶ÇÇÑ ¸Å¿ì ÀÚÁÖ »ç¿ëÀÚ´Â ÀÚ½ÅÀÌ ¿øÇϴ´ë·Î Ä÷³µéÀ» ÀçÁ¤·ÄÇϰíÀÚ ÇÕ´Ï´Ù. ÀÌ ÀÏÀ» ÇØ°áÇϴµ¥ ÁÖ·Î »ç¿ëµÇ´Â ¹æ¹ýÀº Ä÷³À» µå·¡±ëÇÏ´Â °ÍÀ¸·Î »ç¿ëÀÚ°¡ ¸®½ºÆ®¸¦ ÀçÁ¤·Ä(Ä÷³¼ø¼­)Çϵµ·Ï Çϴ°ÍÀÔ´Ï´Ù.

ÇöÀç´Â Ä÷³À» µå·¡±ëÇϴ°Ϳ¡ ´ëÇÑ Áö¿øÀº ¾øÀ¸¸ç, ´ÙÀ½¹öÁ¯ÀÇ °øÅë ÄÁÆ®·Ñ¿¡¼­´Â ¼Ò°³µÉ °Í °°½À´Ï´Ù. ¾Æ·¡´Â À̰ÍÀ» Áö¿øÇÏ´Â ¹æ¹ýÀÔ´Ï´Ù.

´Ü°è 1:         

  Ä¿½ºÅÒ Çì´õ Ŭ·¡½º¸¦ ¸¸µì´Ï´Ù.  CHeaderCtrl ·Î ºÎÅÍ ÆÄ»ýÇÑ Ä¿½ºÅÒ Çì´õ Ŭ·¡½º¸¦ ÀÛ¼ºÇÏ¿©,Ä÷³µå·¡±ëÀ» ó¸®ÇÏ°í »ç¿ëÀÚ¿¡°Ô ºñÁÖ¾óÇÑ Çǵå¹éÀ» Á¦°øÇÏ¸ç ¸¶Áö¸·À¸·Î CListCtrl ÀÇ ¸â¹ö ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ¸®½ºÆ®¸¦ ÀçÁ¤·ÄÇÏ°Ô ÇÕ´Ï´Ù.

¸ÕÀú Çì´õÆÄÀÏÀÔ´Ï´Ù.

#if !defined(   AFX_MYHEADERCTRL_H__CC3DDBF3_EF5E_11D0_82AD_9A0A48000000__INCLUDED_ )
#define                 AFX_MYHEADERCTRL_H__CC3DDBF3_EF5E_11D0_82AD_9A0A48000000__INCLUDED_

#if _MSC_VER >= 1000
        #pragma once
#endif // _MSC_VER >= 1000

// MyHeaderCtrl.h : header file
// CMyHeaderCtrl window

class CMyHeaderCtrl : public CHeaderCtrl
{
        
        public: // Construction
                CMyHeaderCtrl();
                CMyHeaderCtrl(CWnd* pWnd, void (CWnd::*fpDragCol)(int, int));
        public: // Attributes
        public: // Operations
        
        // Overrides
        // ClassWizard generated virtual function overrides    
                //{{AFX_VIRTUAL(CMyHeaderCtrl)
            //}}AFX_VIRTUAL

        public: // Implementation
            virtual ~CMyHeaderCtrl();
        void SetCallback(CWnd* pWnd, void (CWnd::*fpDragCol)(int, int));
        protected:
                BOOL    m_bCheckForDrag;
                BOOL    m_bDragging;
                int*            m_pWidth;
                int             m_nDragCol;
                int             m_nDropPos;
                CRect   marker_rect;
                CWnd*   m_pOwnerWnd;

                void    (CWnd::*m_fpDragCol)(int, int);

        protected:              // Generated message map functions
                //{{AFX_MSG(CMyHeaderCtrl)
                afx_msg void OnMouseMove(UINT nFlags, CPoint point);
                afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
                afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
                //}}AFX_MSG
        DECLARE_MESSAGE_MAP()
};
//{{AFX_INSERT_LOCATION}}
#endif // !defined(AFX_MYHEADERCTRL_H__CC3DDBF3_EF5E_11D0_82AD_9A0A48000000__INCLUDED_)

CMyHeaderCtrl Àº CHeaderCtrl ·Î ºÎÅÍ ÆÄ»ýÇÑ °ÍÀÔ´Ï´Ù. º¯°æ ±âº» »ý¼ºÀÚ°¡ ´Ù¼Ò»ý¼ÒÇÒ°ÍÀÔ´Ï´Ù. À̰ÍÀº CListCtrl À̳ª CListView ÆÄ»ýŬ·¡½º¿¡ ´ëÇÑ Æ÷ÀÎÅÍ¿Í »ç¿ëÀÚ°¡ Ä÷³ µå·¡±ëÀ» ³¡¸¶ÃÆÀ» ½Ã È£ÃâÇÒ ¸â¹öÇÔ¼ö¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ¹Þ½À´Ï´Ù. SetCallback() À̶õ ¸â¹ö ÇÔ¼öµµ Á¤Àǵ˴ϴÙ. ÀÌ ÇÔ¼ö´Â CMyListCtrl Ŭ·¡½ºÀÇ ±âº»(Default) »ý¼ºÀÚ¸¦ »ç¿ëÇÏ°í ½ÍÀ»¶§ »ç¿ëÇÕ´Ï´Ù.

Protected ¸â¹ö º¯¼öÀÇ »ç¿ë¿ëµµ¿¡ ´ëÇÑ °£´ÜÇÑ ¼³¸íÀÔ´Ï´Ù.

 

m_bCheckForDrag

 ´Â »ç¿ëÀÚ°¡ Ä÷³Çì´õ¿¡ ¿ÞÂʸ¶¿ì½º¸¦ Ŭ¸¯ÇßÀ»¶§ WM_LBUTTONDOWN Çڵ鷯¿¡ ÀÇÇØ TRUE ·Î ¼¼Æ®µË´Ï´Ù. À̰ÍÀº WM_MOUSEMOVE Çڵ鷯¿¡ ÀÇÇØ ÇöÀç°¡Ä÷³ µå·¡±× »óÅÂÀÎÁö üũÇϴµ¥ »ç¿ëµË´Ï´Ù. »ç¿ëÀÚ°¡ óÀ½¿¡ Ä÷³Çì´õ¿¡ ¸¶¿ì½º¹öưÀ» ´­·¶À»¶§¸¸ Ä÷³À» µå·¡±ëÇÑ´Ù´Â °ÍÀº Áß¿äÇÕ´Ï´Ù.

m_bDragging             

 Ç÷¡±×´Â Ä÷³µå·¡±×°¡ ÁøÇàÁßÀ̶ó´Â °ÍÀ» ³ªÅ¸³À´Ï´Ù.

m_pWidth

 º¯¼ö´Â Ä÷³³ÐÀÌ¿¡ ´ëÇÑ ¹è¿­À» °¡¸®Å°°í ÀÖ½À´Ï´Ù.À̰ÍÀº µå·ÓÇÒ ¸ñÀûÁöÄ÷³À» °áÁ¤Çϴµ¥ »ç¿ëÇÕ´Ï´Ù.

m_nDragCol                      

 º¯¼ö´Â µå·¡±×µÉ Ä÷³ÀÇ Ä÷³À妽º¸¦ °¡Áö°í ÀÖ½À´Ï´Ù.

m_nDragPos

 ´Â »õ À§Ä¡ÀÇ Ä÷³À妽º¸¦ °¡Áö°í ÀÖ½À´Ï´Ù.

marker_rect

 ´Â »ç¿ëÀÚ¿¡°Ô È­¸é»ó¿¡¼­ º¸¿©Á٠ǥ½ÄÀÎ »ç°¢ÇüÀ» °¡Áö°í ÀÖ½À´Ï´Ù. È­¸é¿¡¼­ Ç¥½ÄÀÇ À§Ä¡°¡ ¹Ù²î¾úÀ»¶§ ÀÌÀü Ç¥½ÄÀ» Áö¿ì´Âµ¥µµ »ç¿ëµË´Ï´Ù.

m_fpDragCol

 º¯¼ö´Â »ç¿ëÀÚ°¡ µå·¡±× ÀÛ¾÷À» ³¡³ÂÀ»¶§ È£ÃâµÉ CListCtrl À̳ª CListView ÀÇ ¸â¹öÇÔ¼ö¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ÀúÀåÇÕ´Ï´Ù.

m_fOwnerWnd

 º¯¼ö´Â m_fpDragCol ¸â¹öÇÔ¼ö°¡ È£ÃâµÉ °´Ã¼¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ °¡Áö°ÔµË´Ï´Ù. À̰ÍÀº º¸Åë ºÎ¸ð  À©µµ¿ì°¡ µÉ°ÍÀÔ´Ï´Ù.

¾Æ·¡´Â ±¸ÇöÆÄÀÏÀÔ´Ï´Ù.

// MyHeaderCtrl.cpp : implementation file

#include "stdafx.h"
#include "MyHeaderCtrl.h"

#ifdef _DEBUG
        #define new     DEBUG_NEW
        #undef          THIS_FILE
        static char     THIS_FILE[] = __FILE__;
#endif

// CMyHeaderCtrl

CMyHeaderCtrl::~CMyHeaderCtrl() {}

CMyHeaderCtrl::CMyHeaderCtrl() : marker_rect(0,0,0,0)
{
        m_pWidth = NULL;
        m_bDragging = FALSE;
        m_bCheckForDrag = FALSE;
        m_fpDragCol = NULL;
        m_pOwnerWnd = NULL;
}
CMyHeaderCtrl::CMyHeaderCtrl(CWnd *pWnd, void (CWnd::*fpDragCol)(int, int))    : marker_rect(0,0,0,0)
{
        m_pWidth = NULL;
        m_bDragging = FALSE;
        m_bCheckForDrag = FALSE;
        m_fpDragCol = fpDragCol;
        m_pOwnerWnd = pWnd;
}

BEGIN_MESSAGE_MAP(CMyHeaderCtrl, CHeaderCtrl)
        //{{AFX_MSG_MAP(CMyHeaderCtrl)
        ON_WM_MOUSEMOVE()
        ON_WM_LBUTTONUP()
        ON_WM_LBUTTONDOWN()
        //}}AFX_MSG_MAP
END_MESSAGE_MAP()
// CMyHeaderCtrl message handlers

void CMyHeaderCtrl::OnMouseMove(UINT nFlags, CPoint point)
{
        if( (MK_LBUTTON & nFlags) == 0) {       // ¿ÞÂʹöưÀÌ ´­·ÁÁöÁö ¾Ê¾Ò´Ù. Ç÷¡±× ¸®¼Â
                m_bCheckForDrag = FALSE;
                m_bDragging = FALSE;
        }       else    if( m_bDragging )                       {       // ¸¶¿ì½º ¾Æ·¡ÀÇ Ä÷³³Ñ¹ö¸¦ °¡Á®¿Â´Ù.
                int i=0, cx = 0;
                if( point.x > 0 )
                        for( i = 0; i < GetItemCount(); i++ )   {
                                if( point.x > cx && point.x < cx + m_pWidth[i] )        break;
                                cx += m_pWidth[i];
                        }

                if( i != m_nDropPos )           {
                        m_nDropPos = i;
                        CRect rect;
                        GetWindowRect( &rect );

                        // ÀÌÀü Ç¥½Ä¿¡ ÀÇÇØ Á¡À¯µÈ ¿µ¿ªÀ» ¹«È¿È­(Invalidate) ÇÑ´Ù.
                        InvalidateRect( &marker_rect );

                        // »õ·Î¿î Ç¥½ÄÀ» ±×¸°´Ù.
                        CClientDC dc(this);
                        POINT pts[3];
                        pts[0].x = cx;
                        pts[1].x = cx -3;
                        pts[2].x = cx +3;     
                        pts[0].y = rect.Height();
                        pts[1].y = pts[2].y = rect.Height() -7;
                        dc.Polygon( pts, 3);

                        // »õ·Î¿î Ç¥½ÄÀÇ Á¤º¸¸¦ ÀúÀåÇÑ´Ù.
                        marker_rect.left = cx - 4;
                        marker_rect.top = rect.Height() -8;
                        marker_rect.right = cx + 4;
                        marker_rect.bottom = rect.Height();
                }
        return;
        }       else    if( m_bCheckForDrag )           {
                // ¸¶¿ì½º ¹öưÀÌ Ä÷³Çì´õ»ó¿¡¼­ Ŭ¸¯µÇ¾ú°í ¸¶¿ì½º°¡ ¿òÁ÷¿´À¸¹Ç·Î µå·¡±ëÀ» ½ÃÀÛÇÑ´Ù.
                m_bCheckForDrag = FALSE;
                m_bDragging = TRUE;
                SetCapture();

                // ³ªÁß »ç¿ëÀ» À§ÇØ Á¤º¸¸¦ ÀúÀåÇÑ´Ù.
                int iCount = GetItemCount();
                HD_ITEM hd_item;
                m_pWidth = new int[iCount];
                for( int i = 0; i < iCount; i++ )       {
                        hd_item.mask = HDI_WIDTH;
                        GetItem( i, &hd_item );
                        m_pWidth[i] = hd_item.cxy;
                }
                return;
        }
        CHeaderCtrl::OnMouseMove(nFlags, point);
}

void CMyHeaderCtrl::OnLButtonUp(UINT nFlags, CPoint point)
{
        ASSERT( m_pOwnerWnd != NULL && m_fpDragCol != NULL );
        if( m_bDragging )               {
                m_bDragging = FALSE;
                delete[] m_pWidth;
                ReleaseCapture();
                Invalidate();

                // ÄݹéÇÔ¼ö¸¦ °¡Á®¿Â´Ù.
                if( m_nDragCol != m_nDropPos && m_nDragCol != m_nDropPos -1 )
                        (m_pOwnerWnd->*m_fpDragCol)( m_nDragCol, m_nDropPos );    
        }
        CHeaderCtrl::OnLButtonUp(nFlags, point);
}

void CMyHeaderCtrl::SetCallback( CWnd* pWnd,void (CWnd::*fpDragCol)(int, int))
{
        m_fpDragCol     = fpDragCol;
        m_pOwnerWnd     = pWnd;
}

void CMyHeaderCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
        // ¸¶¿ì½º°¡ Ä÷³Çì´õ»ó¿¡¼­ ´­·È´ÂÁö °Ë»çÇÑ´Ù.
        HD_HITTESTINFO hd_hittestinfo;
        hd_hittestinfo.pt = point;
        SendMessage(HDM_HITTEST, 0, (LPARAM)(&hd_hittestinfo));
        if( hd_hittestinfo.flags == HHT_ONHEADER )      {
        m_nDragCol = hd_hittestinfo.iItem;
        m_bCheckForDrag = TRUE;
        }
        CHeaderCtrl::OnLButtonDown(nFlags, point);
}

CMyHeaderCtrlÀÇ ±¸ÇöÀº ¸Å¿ì °£´ÜÇÕ´Ï´Ù. À̰ÍÀº ÇʼöÀûÀ¸·Î WM_MOUSEMOVE, WM_LBUTTONDOWN, WM_LBUTTONUP ¿¡ ´ëÇÑ Çڵ鷯¸¦ °¡Áö°í ÀÖ½À´Ï´Ù.

OnLButtonDown()Àº m_nDragCol ¿¡ °ªÀ» ³Ö°í ¸¸¾à »ç¿ëÀÚ°¡ Ä÷³Çì´õ»ó¿¡¼­ ¸¶¿ì½º¹öưÀ» ´­·¶´Ù¸é m_bCheckForDrag ¸¦ ¼¼Æ®ÇÑ´Ù.

OnMouseMove() ´Â »ç¿ëÀÚ¿¡°Ô ½Ã°¢ÀûÀÎ È¿°ú¸¦ Áִ°÷ÀÌ´Ù. À̰ÍÀº ¸ÕÀú ¿ÞÂʸ¶¿ì½º¹öưÀÌ ´­·È´ÂÁö üũÇϰí m_bCheckForDrag ¿Í m_bDragging Ç÷¡±×¸¦ ¸®¼ÂÇÕ´Ï´Ù. ¸¸¾à µå·¡±ëÁßÀ̶ó¸é m_nDropPos °ªÀÌ ¼¼Æ®µÇ°í Çì´õ»ó¿¡ Ç¥½ÄÀÌ ±×·ÁÁý´Ï´Ù. ¸¸¾à óÀ½ µÎ°³ÀÇ Á¶°ÇÀÌ ½ÇÆÐÇÏ¸é µå·¡±×°¡ ÃʱâÈ­µÇ¾î¾ß ÇÏ´ÂÁö üũÇÕ´Ï´Ù.

OnLButtonUp() Àº µå·¡±× ÀÛ¾÷À» Á¾·áÇϰí , µå·¡±×°¡ ÁøÇàÁßÀ̾ú´Ù¸é ÄݹéÇÔ¼ö¸¦ µå·¡±×µÈ Ä÷³°ú µå·Ó À§Ä¡¸¦ ÀÎÀÚ·Î ÇØ¼­ È£ÃâÇÕ´Ï´Ù.

´Ü°è 2:         

 CListCtrl ÆÄ»ýŬ·¡½º¿¡ CMyHeaderCtrl ¸â¹öº¯¼ö¸¦ Ãß°¡ÇÕ´Ï´Ù. ¸¸¾à CListView¸¦»ç¿ëÁßÀ̶ó¸é ±× Ŭ·¡½º¿¡ ¸â¹öº¯¼ö¸¦ Ãß°¡ÇÕ´Ï´Ù.

    CMyHeaderCtrl   m_headerctrl;

´Ü°è 3:         

 CMyHeaderCtrl °´Ã¼¸¦ ÃʱâÈ­ ÇÕ´Ï´Ù. CListCtrl ÆÄ»ýŬ·¡½ºÀÇ »ý¼ºÀÚ¿¡ ¾Æ·¡¹®ÀåÀ» Ãß°¡ÇÕ´Ï´Ù.

                m_headerctrl.SetCallback( this, (void (CWnd::*)(int, int))DragColumn );

 DragColumn Àº ´ÙÀ½´Ü°è¿¡¼­ Á¤ÀÇÇÒ ÄݹéÇÔ¼öÀÔ´Ï´Ù.

´Ü°è 4:        

  Ä÷³ ÀçÁ¤·ÄÀ»À§ÇØ ÄݹéÇÔ¼ö¸¦ Á¤ÀÇÇÕ´Ï´Ù.

 CMyHeaderCtrl °´Ã¼´Â »ç¿ëÀÚ°¡ µå·¡±× ÀÛ¾÷ÀÌ ³¡³µÀ»¶§ È£ÃâÇÒ ÇÔ¼öÀÇ Æ÷ÀÎÅ͸¦ ÇÊ¿ä·Î ÇÕ´Ï´Ù. ÀÌÇÔ¼ö´Â ÄݹéÇÔ¼ö·Î ½ÇÁ¦·Î Ä÷³À» ÀçÁ¤·ÄÇÒ Ã¥ÀÓÀÌ ÀÖ½À´Ï´Ù. ¿ì¸®´Â 3¿¡¼­ CMyHeaderCtrl°´Ã¼¸¦ ÃʱâÈ­ ÇÒ ¶§ DragColumnÀ̶õ °ÍÀ» »ç¿ëÇß½À´Ï´Ù.

void CMyListCtrl::DragColumn(int source, int dest)
{
        TCHAR sColText[160];
        // ¸ñÀûÁö¿¡ Ä÷³À» »ðÀÔÇÑ´Ù.
        LV_COLUMN   lv_col;
        lv_col.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;
        lv_col.pszText = sColText;
        lv_col.cchTextMax = 159;
        GetColumn( source, &lv_col );
        lv_col.iSubItem = dest;
        InsertColumn( dest, &lv_col );

        // »õÄ÷³ÀÌ »ðÀԵǾú±â ¶§¹®¿¡ º¯È­µÈ ¿øº» Col ¹øÈ£¸¦ Á¶ÀýÇÑ´Ù.
        // because a new column was inserted
        if( source > dest )     source++;

        // Ä÷³À» 0 À§Ä¡·Î ¿Å±â´Â °ÍÀº Ưº°ÇÑ °æ¿ìÀÌ´Ù.
        if( dest == 0 ) 
                for( int i = GetItemCount()-1; i > -1 ; i-- )
                        SetItemText(i, 1, GetItemText( i, 0) );

        // ¿øº»¿¡¼­ ¸ñÀûÁö·Î ÇϺξÆÀÌÅÛÀ» º¹»çÇÑ´Ù.
        for( int i = GetItemCount()-1; i > -1 ; i-- )
        SetItemText(i, dest, GetItemText( i, source ) );

        // ùÄ÷³ÀÌ ¾Æ´Ñ°æ¿ì ¿øº» Ä÷³À» Áö¿ó´Ï´Ù.
        if( source != 0 )       DeleteColumn( source );
        else            {
                // ¸¸¾à ¿øº» Ä÷³ÀÌ 0À̸é col#1 ÀÇ °ÍÀ» col#0 À¸·Î º¹»çÇÑ´Ù.
                // and then delete col# 1
                GetColumn( 1, &lv_col );
                lv_col.iSubItem = 0;
                SetColumn( 0, &lv_col );
                for( int i = GetItemCount()-1; i > -1 ; i-- )
                        SetItemText(i, 0, GetItemText( i, 1) );        
                        DeleteColumn( 1 );
        }
        Invalidate();
}

ÀÌ ÇÔ¼ö¿¡¼­ ÃëÇÑ ÀϹÝÀûÀÎ Á¢±Ù¹æ¹ýÀº ¸Â´Â ÀÚ¸®¿¡ Ä÷³À» »ðÀÔÇϰí, ¿øº»ÀÇ ¸ðµçÄ÷³À» ¸ðµç ÇϺξÆÀÌÅÛÀ¸·Î ¿Å±â´Â °Ì´Ï´Ù. ¸®½ºÆ®ºä ÄÁÆ®·ÑÀº ù¹øÂ° Ä÷³¿¡ Ưº°ÇÑ Ã³¸®¸¦ ÇØÁÖÁö ¾Ê½À´Ï´Ù¸¸, ¿ì¸®´Â ÇØ¾ß¸¸ ÇÕ´Ï´Ù. ´ç½ÅÀÌ Ä÷³À» Ãß°¡Çϰųª»èÁ¦ÇÒ¶§ ¾Ë¾Æ¾ßÇÒ Æ¯º°ÇÑ °ÍÀº... 0¹ø À§Ä¡¿¡ Ä÷³À» Ãß°¡ÇÏ·Á°í ÇÒ¶§ ÀÌ¹Ì ÇϳªÀÌ»óÀÇ Ä÷³ÀÌ ÀÖ´Ù¸é »õ Ä÷³Àº ½ÇÁ¦·Î µÎ¹øÂ° Ä÷³¿¡ Ãß°¡µË´Ï´Ù. ¸¸¾à ù¹øÀç Ä÷³À» Áö¿î´Ù¸é °á°ú´Â Ä÷³Çì´õµéÀÌ ¿ÞÂÊÀ¸·Î Çϳª¾¿ ½ÃÇÁÆ®µÇ°í ¸¶Áö¸·Ä÷³ÀÌ Áö¿öÁø´Ù´Â °ÍÀÔ´Ï´Ù. DragColumn() ÇÔ¼ö´Â ÀÌ µÎ°¡Áö»óȲÀ» ó¸®ÇÕ´Ï´Ù.

´Ü°è 5:

 ¸¶Áö¸·À¸·Î Çì´õÄÁÆ®·ÑÀ» ¼­ºêŬ·¡½º ÇÕ´Ï´Ù. ÁÁÀº °÷Àº ¸®½ºÆ®ºä ÄÁÆ®·Ñ Ŭ·¡½ºÀÇPreSubclassWindow() ÀÔ´Ï´Ù.

void CMyListCtrl::PreSubclassWindow()
{
        CListCtrl::PreSubclassWindow();

        // Add initialization code
        m_headerctrl.SubclassWindow( ::GetDlgItem(m_hWnd,0) );
}

¸®½ºÆ®ºä ÄÁÆ®·ÑÀ» »ç¿ëÇÏ½Ç ÀÏÀÌ »ý±â½Ã¸é ¾ÆÁÖ µµ¿òÀÌ µÉ°Å¶ó ¹Ï½À´Ï´Ù.

 

- the end of this article -