count = SendMessage(hList, LB_GETSELCOUNT, 0, 0);

            SendMessage(hList, LB_GETSELITEMS, 100, (LPARAM)cursel);

            for(int i=count-1; i>-1; i--)

            {

                SendMessage(hList, LB_DELETESTRING, cursel[i],0);

            }


선택된 여러 셀들을 삭제하려면


LB_GETSELCOUNT메시지를 보내 현재 선택된 셀의 갯수를 구하고


LB_GETSELITEMS 메시지를 보내 선택된 셀들의 인덱스를 담고있는 배열을 받아야한다


GETSELITEMS 메시지는 LPARAM에 전달된 배열에 인덱스를 채워주고 리턴된다. 


그리고 for문을 돌며 삭제를 해야하는데 이 때 , 반드시 거꾸로 삭제를 진행해야만 한다.


총9개의 셀이 선택됐다면, 배열은 0~8번까지 차있고


배열의 인덱스 8부터 시작해서 0까지 참조후 삭제해야 정상적인 삭제가 이뤄진다. 


0부터 8까지 올림차순으로 삭제를 진행하면 정상적인 삭제가 이뤄지지 않는다. 


예를들어


리스트 박스의 1,2,3 번째 셀이 선택되어 있다면


1번 셀을 지웠을경우 2번 셀이 1번 셀의 자리로 이동된다. 


그 때문에 다음에 2번 셀을 지울때 3번 셀이 2번으로 이동되어있기 때문에 3번 셀이 지워지며 3번 셀을 지우려고하면 해당 데이터가 없는상황이 발생한다.


그러므로 listbox의 셀을 지울땐 반드시 거꾸로 진행해야 한다. 



Posted by $Zero
: