BOOL CLeftview::OnDrop(COleDataBbject * pDataObject,DROPEFFECT dropEffect,CPoint point)
{
CString StrFolderName;
HTREEITEM hTargetFolder;
CTreeCtrl& treeCtrl = GetTreeCtrl();
CExplorerTestDoc* pDoc = GetDocument();
hTargetFolder = treeCtrl.GetDropHilightItem();
StrFolderName = GetFullPathName(hTargetFolder);
if(dropEffect == DROPEFFECT_COPY)
{
HGLOBAL globalMem;
CSharedFile sharedFile;
globalMem = Sethandle(globalMem,FALSE);
CArchive ar(&sharedFile, CArchive::load);
GetDocument()->SerializeCopyFiles(ar);
ar.Close();
CopyFilesToFolder(strFolderName);
}
treeCtrl.SelectDropTarget(0);
treeCtrl.SelectItem(treeCtrl.GetSelectedItem())//포커스 환원
return TRUE;
}
//OnDrop()함수는 드래그&드롭에 의해 실제 파일들을 복사해 주는 역할을 한다.따라서 처음 부분에는 현재 드롭된 아이템의 경로
//이름을 알아낸 다음 onDragOver()에서 리턴한 값이 DROPEFFECT_COPY일 때만 선택된 파일들을 해당 아이템에 복사하게 된다.
void CLeftView::CopyFilesToFolder(CString strFolderName)
{
CObList * pFileList;
LIST_VIEW * pListView;
CString strMessage strmessage,strTargetFile,strFileName;
CWaitCursor waitCursor;//파일 복사중에 모래시계 커서로 바꾼다.
pFileList = GetDocument()->GetCopyFileList();
for(POSITION pos = pFileList->GetHeadPosition();pos!=NULL)
{
pListView =(LIST_VIEW*)pFileList->GetNext(pos);
strFileName = pListView->strName;
strTargetFile = strFolderName + strFileName;
if(::CopyFile(pListView->strPath,strTargetFile,TRUE)==FALSE)
{
DWORD dwError =::GetLastError();
strmessage.Format("이 볼더에 이미 %s 파일이 잇습니다.\n파일을 바꾸시겠습니까?",strFileName);
if(MessageBox(strmessage,"파일 바꾸기 확인"),MB_ICONQUESTION|MB_YESNO)==IDYES)
{
dwError = ::GetLastError();
strMessage.Format("'%s'파일 복사 실패",strFileName);
MessageBox(strmessage,"파일 복사",MB_ICONSTOP);
}
}
}
}
//이 함수는 지렬화를 통해 알아낸 파일 리스트를 이용하여 Win32 API인 ::CopyFile()를 호출해서 파일들을 실제로 복사하는 역할을 수행한다,다음은 좌측의 리스트 뷰에서 두 개의 파일을 선택하여 트리 뷰로 드래그&드롭을 하는 모습이다,만약 동일한 파일이 있는 경우 기존 파일의 변경 여부를 묻는 다이얼 로그가 출격된다.
没有评论:
发表评论