// 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>) // 基底クラスへチェーン
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);
}
};
|