< µå·¡±× ¸®½ºÆ® ¹Ú½º >¡¡

WTL´Â  ¸®½ºÆ® ¹Ú½º ÄÁÆ®·Ñ¿¡ µå·¯±×£¦µå·Ó¿¡ ÀÇÇØ ¾ÆÀÌÅÛÀÇ ¼ø¼­¸¦ º¯°æÇÏ´Â ±â´ÉÀ» Ãß°¡ÇÑ µå·¡±× ¸®½ºÆ® ¹Ú½º ÄÁÆ®·ÑÀ» ÀÛ¼ºÇϱâ À§Çؼ­  CDragListBoxT ¶ó´Â CDragListNotifyImpl¶ó°í ÇÏ´Â ÅÛÇø´ Ŭ·¡½º¸¦ ÁغñÇØ ÀÖ½À´Ï´Ù.  CDragListBoxT Ŭ·¡½º´Â CListBoxT Ŭ·¡½ºÀÇ »ó¼Ó Ŭ·¡½ºÀÔ´Ï´Ù.
atlctrls.h Çì´õ¿¡¼­´Â ´ÙÀ½°ú °°ÀÌ Á¤Àǵǰí ÀÖ½À´Ï´Ù.

// atlctrls.h

template <class TBase>

class CDragListBoxT : public CListBoxT< TBase >

{

   ...

   ...

};

 

typedef CDragListBoxT<ATL::CWindow>   CDragListBox;

                      


¡¡WTL
ÀÇ CDragListBox Ŭ·¡½º¿Í CDragListNotifyImplŬ·¡½º¸¦ »ç¿ëÇÏ´Â °ÍÀ¸·Î MFCÀÇ CDragListBox Ŭ·¡½º¿Í µ¿µîÀÇ ±â´ÉÀ» ½ÇÇöÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÌÇÏ¿¡ ³ªÅ¸³»´Â °ÍÀº CDragListBox Ŭ·¡½º¿Í CDragListNotifyImpl Ŭ·¡½º¸¦ »ç¿ëÇØ µå·¡±× ¸®½ºÆ® ¹Ú½º¸¦ ÀÛ¼ºÇÏ´Â ¿¹ ÀÔ´Ï´Ù.

 

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

{

public:

    enum { IDD = IDD_MAINDLG };

 

    CDragListBox m_list_drag;

 

    // ¸Þ¼¼Áö ¸Ê

    BEGIN_MSG_MAP_EX(CMainDlg)

        MSG_WM_INITDIALOG(OnInitDialog)

        COMMAND_ID_HANDLER_EX(IDOK, OnOK)

        COMMAND_ID_HANDLER_EX(IDCANCEL, OnCancel)

        CHAIN_MSG_MAP(CDragListNotifyImpl<CMainDlg>)  // base class¿¡ üÀÎ

    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_drag = GetDlgItem(IDC_LIST_DRAG);

        m_list_drag.MakeDragList();

 

        m_list_drag.AddString(_T("¾ÆÀÌÅÛ1"));

        m_list_drag.AddString(_T("¾ÆÀÌÅÛ2"));

        m_list_drag.AddString(_T("¾ÆÀÌÅÛ3"));

        m_list_drag.AddString(_T("¾ÆÀÌÅÛ4"));

        m_list_drag.AddString(_T("¾ÆÀÌÅÛ5"));

 

        return TRUE;

    }

 

    BOOL OnBeginDrag(int nCtlID, HWND hWndDragList, POINT ptCursor){

        // Ä¿¼­ À§Ä¡ÀÇ ¾ÆÀÌÅÛÀÇ ÁÂÃøÀ¸·Î »ðÀÔ ¸¶Å©¸¦ ¹¦È­

        m_list_drag.DrawInsert(m_list_drag.LBItemFromPt(ptCursor));

        return TRUE;

    }

 

    void OnCancelDrag(int nCtlID, HWND hWndDragList, POINT ptCursor){

        // »ðÀÔ ¸¶Å©¸¦ ¼Ò°Å

        m_list_drag.DrawInsert(-1);

    }

 

    int OnDragging(int nCtlID, HWND hWndDragList, POINT ptCursor){

        // Ä¿¼­ À§Ä¡ÀÇ ¾ÆÀÌÅÛÀÇ ÁÂÃøÀ¸·Î »ðÀÔ ¸¶Å©¸¦ ¹¦È­

        m_list_drag.DrawInsert(m_list_drag.LBItemFromPt(ptCursor));

        return 0;

    }

 

    void OnDropped(int nCtlID, HWND hWndDragList, POINT ptCursor){

        // »ðÀÔ ¸¶Å©¸¦ ¼Ò°Å

        m_list_drag.DrawInsert(-1);

 

        int nSrcIndex = m_list_drag.GetCurSel();              // À̵¿¿øÀÇ À妽º

        int nDestIndex = m_list_drag.LBItemFromPt(ptCursor);  // À̵¿Ã³ÀÇ À妽º

 

        if(nSrcIndex == -1 || nDestIndex == -1 || nDestIndex == nSrcIndex)

            return;

 

        CString strText;

        m_list_drag.GetText(nSrcIndex, strText);

        m_list_drag.DeleteString(nSrcIndex);

 

        m_list_drag.InsertString(nDestIndex, strText);

        m_list_drag.SetCurSel(nDestIndex);

    }

 

    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¸¦ ´ÙÀ½°ú °°ÀÌ ÁöÁ¤ÇÕ´Ï´Ù. µ¡ºÙ¿© LBS_MULTIPLESEL¶Ç´Â LBS_EXTENDEDSEL½ºÅ¸ÀÏÀº ÁöÁ¤ ÇØ¼­´Â ¾ÈµË´Ï´Ù.

ÄÁÆ®·Ñ¸í

¸®¼Ò½º ID

¸®½ºÆ® ¹Ú½º

IDC_LIST_DRAG


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

¡¡
CDragListNotifyImplŬ·¡½º´Â ¸ÞÀÎ À©µµ¿ìÀÎ CMainDlgŬ·¡½ºÀÇ base class·Î¼­ »ç¿ëÇÕ´Ï´Ù. CMainDlgŬ·¡½º¿¡¼­´Â ¿ì¼± µå·¡±× ¸®½ºÆ® ¹Ú½º¿ëÀ¸·Î CDragListBox Ŭ·¡½ºÀÇ ÀνºÅϽº¸¦ ¸â¹ö º¯¼ö·Î¼­ ¼±¾ðÇÕ´Ï´Ù. À̰ÍÀ» »ç¿ëÇϱâ À§Çؼ­´Â WM_INITDIALOG ¸Þ¼¼Áö Çڵ鷯·Î ÄÁÆ®·ÑÀÇ ÇÚµéÀ» ´ëÀÔÇÒ Çʿ䰡 ÀÖ½À´Ï´Ù.

¡¡
´ÙÀ½À¸·Î WM_INITDIALOG ¸Þ¼¼Áö Çڵ鷯¿¡¼­´Â MakeDragList()À» È£ÃâÇØ ¸®½ºÆ® ¹Ú½º¸¦ µå·¡±× ¸®½ºÆ® ¹Ú½ºÈ­ÇØ ±× µå·¡±× ¸®½ºÆ® ¹Ú½º ÄÁÆ®·Ñ¿¡ ¾ÆÀÌÅÛÀ» Ãß°¡ÇÕ´Ï´Ù.

¡¡
´ÙÀ½À¸·Î ¸Þ¼¼Áö ¸Ê¿¡ base classÀÎ CDragListNotifyImplŬ·¡½º¿¡ÀÇ Ã¼ÀÎÀ» Ãß°¡ÇÕ´Ï´Ù. À̰Ϳ¡ ÀÇÇØ µå·¹±× ¸®½ºÆ® ¹Ú½º ÄÁÆ®·Ñ ¿ëÀÇ ¸Þ¼¼Áö°¡ µî·ÏµÇ¾î ±× ¸Þ¼¼Áö°¡ ¸ÞÀÎ À©µµ¿ì¿¡ º¸³»Á® ¿À¸é üÀο¡ ÀÇÇØ CDragListNotifyImplŬ·¡½ºÀÇ ¸â¹ö ÇÔ¼ö°¡ ºÒ·Á °©´Ï´Ù.  CDragListNotifyImplŬ·¡½º´Â ¸Þ¼¼ÁöÀÇ ÅëÁö Äڵ忡 ÀÇÇØ ´ÙÀ½°ú °°Àº ¸â¹ö ÇÔ¼ö¸¦ ÁغñÇØ ÀÖ½À´Ï´Ù.

ÅëÁö ÄÚµå

¸â¹ö ÇÔ¼ö¸í

DL_BEGINDRAG

OnBeginDrag

DL_CANCELDRAG

OnCancelDrag

DL_DRAGGING

OnDragging

DL_DROPPED

OnDropped


CDragListNotifyImplŬ·¡½ºÀÇ »ó¼Ó Ŭ·¡½º´Â ÀÌ·¯ÇÑ ¸â¹ö ÇÔ¼ö¸¦ ¿À¹ö¶óÀ̵å(override) ÇÏ´Â °Í¿¡ ÀÇÇØ µå·¡±× ¸®½ºÆ® ¹Ú½º ÄÁÆ®·Ñ ³»ÀÇ ¾ÆÀÌÅÛÀÌ µå·¡±×£¦µå·Ó µÇ¾úÀ» ¶§ÀÇ µ¿ÀÛÀ» Ä¿½ºÅ͸¶ÀÌÁî ÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù.

¡¡
À§ÀÇ ¿¹ ¿¡¼­´Â 4°³ÀÇ ¸â¹ö ÇÔ¼ö ¸ðµç °ÍÀ» ¿À¹ö¶óÀ̵å(override) Çϰí ÀÖ½À´Ï´Ù. ¿ì¼± OnBeginDrag()Àº ¾ÆÀÌÅÛ µå·¡±× Çϱâ Á÷Àü(¸¶¿ì½º Ä¿¼­·Î ¼±ÅÃÇßÀ» ¶§ )¿¡  OnDragging()´Â µå·¡±× ÇÑÁß°£¿¡ ºÒ·Á Áý´Ï´Ù¸¸ ¾î´À ÂÊÀ̳ª DrawInsert()¸¦ »ç¿ëÇØ »ðÀÔ ¸¶Å©¸¦ ±×¸®°í ÀÖ½À´Ï´Ù. OnDropped()Àº µå·Ó µÇ¾úÀ» ¶§¿¡ ºÒ·Á °©´Ï´Ù¸¸ ¿©±â¿¡¼­´Â ¿ì¼±DrawInsert()¿¡ -1¸¦ °Ç³×ÁÖ¾î »ðÀÔ ¸¶Å©¸¦ ¼Ò°ÅÇØ ´ÙÀ½¿¡ ¼±Åõǰí ÀÖ´Â ¾ÆÀÌÅÛÀÇ À妽º¿Í µå·Ó µÈ À§Ä¡ÀÇ ¾ÆÀÌÅÛÀÇ À妽º¸¦ ÃëµæÇÕ´Ï´Ù. ÀÌ·¯ÇÑ À妽º°¡ ¿¡·¯ ¶Ç´Â °°Àº °æ¿ì ¶§´Â ±»ÀÌ ÇÏÁö ¾Ê°í ³¡³³´Ï´Ù. ±×·¸Áö ¾ÊÀº °æ¿ì´Â  ¼±Åõǰí ÀÖ´Â ¾ÆÀÌÅÛ Ä³¸¯ÅÍ ¶óÀÎÀ» ÃëµæÇØ ¾ÆÀÌÅÛÀ» »èÁ¦ÇØ ±× ÈÄ¿¡ µå·Ó µÈ À§Ä¡¿¡ ±× ¾ÆÀÌÅÛÀ» »ðÀÔÇÕ´Ï´Ù. µ¡ºÙ¿©OnCancelDrag()´Â µå·¡±×¸¦ ÁßÁö ÇßÀ» ¶§¿¡ ºÒ·Á Áý´Ï´Ù¸¸ ¿©±â¿¡¼­´Â »ðÀÔ ¸¶Å©¸¦ Á¦°ÅÇϰí ÀÖ½À´Ï´Ù.