|
안녕하세요... 예전에 이 문제를 가지고 한번 질문을 올렸었더랬는데 답변이 없어 다시 한번
글을 올립니다..
ListView 에서 TreeView 로 Drag&Drop 을 하는데 까지는 성공을 했는데요... 문제는 ListView
에서 TreeView 로 Drag&Drop 을 할때 ListView 의 내용 그러니까 이동하려는 item 의 내용이
화면에 잔상으로 남아 있습니다.. 그리고 마우스의 형태도 남아 있구요... 이 부분을 화면을
refresh 시키는 부분으로 해결 하려고 했으나 사용자가 이동을 하려고 하다가 이동을 하지 않고
다시 원래의 자리로 복귀하는 경우 잔상이 남아 지저분하게 보입니다...
ListView 에서 DragMode 는 Automatic 으로 되어 있습니다...
그런데... 하나의 Item을 옮길때는 그런 현상이 발생하는데.. 다중으로 선택을 하여 Drag&Drop을
하면 깨끗하게 잘 넘어갑니다...
혹시 이런 경험을 해보신 분이 없는지.. ListView에서 TreeView 로의 Drag&Drop은 질문과 답변이
많이 있는 걸 봐서는 이런 경험이 없진 않을꺼 같은데 이와 같은 문제로 나온 말들이 없어
참으로 답답합니다... 고수님들의 도움을 바랍니다... 감사합니다...
p.s : 하나의 Item 을 옮길때, 즉 Drag 할때 마우스와 옮긴다는 표시 그리고 옮기려고 하는 item
의 내용이 희미하게 나타나잖아요... 다중 선택을 할때는 옮긴다는 표시만 나고 Item의 내용은
나타나지 않거든요... 하나의 Item을 옮길때도 다중 선택을 했을때 처럼 옮긴다는 표시만 나고
Item의 내용은 표시가 나지 않는다면 어쩌면 해결이 될수도 있을꺼 같은데..
아무튼 도움을 바랍니다... 감사합니다... 아래에 Drag&Drop 에 관련된 제 소스를 올립니다..
수고하세요...
void __fastcall TNameCard_Form::tvGroupDragOver(TObject *Sender,
TObject *Source, int X, int Y, TDragState State, bool &Accept)
{
if( Source->InheritsFrom( __classid( TTreeView ) ) )
Accept = true;
}
//---------------------------------------------------------------------------
void __fastcall TNameCard_Form::tvGroupDragDrop(TObject *Sender,
TObject *Source, int X, int Y)
{
TListItem *pItem;
if( m_bStatus ) {
if ( Source != ( TObject * )tvGroup || tvGroup->Selected == NULL )
return;
THitTests HT = tvGroup->GetHitTestInfoAt( X, Y );
TNodeAttachMode AttachMode;
TTreeNode *pItem = tvGroup->GetNodeAt( X, Y );
if( !pItem ) {
return;
}
if ( tvGroup->Selected == pItem ) {
Application->MessageBoxA( "Group을 이동할 수 없습니다. 대상 Group과 같은 Group입니다.", "그룹 이동 오류", MB_ICONERROR+MB_OK );
return;
}
if ( HT.Contains( htOnItem ) || HT.Contains( htOnIcon ) )
AttachMode = naAddChild;
else if ( HT.Contains( htNowhere ) )
AttachMode = naAdd;
else if ( HT.Contains( htOnIndent ) )
AttachMode = naInsert;
else
return;
tvGroup->Selected->MoveTo(pItem, AttachMode);
}
else {
TTreeNode *pTreeItem = tvGroup->GetNodeAt( X, Y );
pItem = lvPerson->Selected;
if( !pTreeItem ) {
return;
}
if( pTreeItem->AbsoluteIndex < 1 ) {
Application->MessageBoxA( "ALL Group으로는 데이터를 옮길 수 없습니다.", "데이터 이동 오류", MB_ICONERROR+MB_OK );
return;
}
tvGroup->Refresh(); //// 이부분은 잔상 때문에 refresh 를 하고 있습니다..
lvPerson->Refresh();
}
//---------------------------------------------------------------------------
void __fastcall TNameCard_Form::tvGroupEndDrag(TObject *Sender,
TObject *Target, int X, int Y)
{
if( Target ) tvGroup->Update();
}
//---------------------------------------------------------------------------
|