< µå·¡±× ¸®½ºÆ® ¹Ú½º >¡¡
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()´Â µå·¡±×¸¦ ÁßÁö ÇßÀ» ¶§¿¡ ºÒ·Á Áý´Ï´Ù¸¸ ¿©±â¿¡¼´Â »ðÀÔ ¸¶Å©¸¦ Á¦°ÅÇϰí ÀÖ½À´Ï´Ù.