: ListView 가 2개 있을때, 각각의 아이템에 Image 가 정해져 있습니다.
:
: 그런데 ListView1의 아이템을 드래그 해서 ListView2에 놓게 할순 없나요?
: 물론 이미지도 같이...
:
: 다시 말해서, 이미지가 있는 아이템을 드래그 해서 그대로 다른 ListVeiw에 놓았을때,
: 다른 ListView 에서 자기의 아이템(이미지도 같이)처럼 관리 하게 하는 방법을 알고 싶습니다.
:
임펠리테리입니다.
좀 복잡한 소스지만.. 잠시 고민하다가 소스를 작성해봤습니다. 다음부터는 직접 해보시고
잘 안되는 부분에서만 질문해주시길...
먼저 두 리스트뷰의 DragMode는 dmAutomatic로 설정하고, 두 리스트뷰의 OnDragOver와 OnDragDrop
이벤트의 핸들러는 모두 다음의 두 함수로 설정하세요.
void __fastcall TForm1::ListView1DragOver(TObject *Sender, TObject *Source,
int X, int Y, TDragState State, bool &Accept)
{
if(Source==ListView1 || Source==ListView2) Accept = true;
}
void __fastcall TForm1::ListView1DragDrop(TObject *Sender, TObject *Source,
int X, int Y)
{
TListView *SrcListView = dynamic_cast<TListView *>(Source);
TListView *DstListView = dynamic_cast<TListView *>(Sender);
if(SrcListView==NULL || DstListView==NULL) return;
TListItem *NewItem = DstListView->Items->Add();
NewItem->Assign(SrcListView->ItemFocused);
DstListView->Checkboxes = false; // 리스트뷰의 버그를 막기 위해
SendMessage(DstListView->Handle, LVM_SETITEMPOSITION, NewItem->Index, MAKELPARAM(X, Y));
SrcListView->Items->Delete(SrcListView->ItemFocused->Index);
}
이때 주의할 것. 이미지리스트는 반드시 두 리스트뷰에서 공유해야 합니다. 이미지리스트는
각 아이템의 참조가 간단하지 않으므로 한 이미지리스트를 공유하는 방법을 사용했습니다.
그러니까, 첫번째 리스트뷰의 아이템들에는 이미지리스트의 0번~4번까지 할당하고 다른 리스트뷰엔
5번 이상을 할당한다든지 해서 두 리스트뷰가 한 이미지리스트를 공유하면서도 아이템들의 이미지
가 겹치지 않도록 하면 됩니다.
그럼 참고하시길...
|