본문 바로가기
C++ 200제/코딩 IT 정보

MFC : 리스트 컨트롤 + 드래그 앤 드랍 (List Control 마우스 이벤트)

by vicddory 2018. 3. 25.

MFC : 리스트 컨트롤 + 드래그 앤 드랍 (List Control 마우스 이벤트)



MFC List Control(리스트 컨트롤)에 드래그 앤 드랍 기능 추가


전체 프로젝트 - Drag and Drop ListCtrl_demo.zip [링크]

실행 프로젝트 - Drag and Drop ListCtrl_exe.zip [링크]

프로젝트 소스 - Drag and Drop ListCtrl_src.zip [링크]


위의 MFC 리스트 컨트롤 예제는 다음과 같은 기능을 포함합니다.


1. 하나, 또는 두 개 이상의 드래그앤 드랍을 지원

2. 마우스가 위에 이동하는 잠재적 인 드래그 대상은 (선택) 강조 표시됩니다.

3. List Control에 파일을 추가할 때 스크롤이 이동

4. 좌우로 이동하는 마우스 움직임은 무시

5. LVS_EX_FULLROWSELECT와 함께 동작

6. 드래그 항목의 체크 상태를 유지

7. 모든 List Control 코드는 캡슐화


MFC 리스트 컨트롤 예제[MFC 리스트 컨트롤 예제] 시작 화면


새로운 클래스에서 드래그앤 드랍을 사용하려면 DragDropListCtrl.h 파일을 추가하면 됩니다.


그리고, 다이얼로그의 드래그앤 드랍에 관한 속성을 추가합니다. 대부분의 기능은 MFC 프로젝트의 DragDropListCtrl.h에 있습니다. 추가로, 원본의 댓글을 보면 코드 중에 수정할 부분이 있습니다.


아래에 소개합니다.


1. 리스트 컨트롤에 추가되는 아이템을 포함한 전체 아이템의 카운팅


1
2
3
4
5
6
void CDragDropListCtrl::DropItem()
{
    RestorePrevDropItemState();    // 추가 작업이 완료된 이후에 카운팅
    if (m_nDropIndex > m_anDragIndexes[0])
        m_nDropIndex++;
 
cs


MFC List Control 예제[MFC List Control 예제] 실행 화면


2. 리스트 컨트롤 메모리 누수 해결 (Memory Leak)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void CDragDropListCtrl::DropItem() // 항목을 삭제하기 전에 lParam의 값을 변경
{  ...    
    lvItem.iItem=nDragIndex;
    lvItem.iSubItem=0;    lvItem.mask=LVIF_PARAM;
    lvItem.lParam=(LPARAM)0L;
    SetItem(&lvItem);    // 항목 삭제
    DeleteItem(nDragIndex);    ...
}
 
Other fix: delete dcMem:CImageList* CDragDropListCtrl::CreateDragImageEx(LPPOINT lpPoint)
{
    ..
    cMem.SelectObject(pOldMemDCBitmap);    //DC의 Mem을 Delete
    cMem.DeleteDC();
    ..
}
cs


MFC : 리스트 컨트롤 + 드래그 앤 드랍 (List Control 마우스 이벤트)