Exemple #1
0
BOOL moveSelected (HWND hDlg, UINT fullPathIdSrc, UINT panelIdSrc, UINT fullPathIdDst, UINT panelIdDst)
{
	TCHAR fileName [MAX_PATH];
	LVITEM lvi;
	lvi.mask = LVIF_PARAM;
	lvi.iSubItem = 0;
	
	// Создать задание для копирования
	Task* copyTask = new Task ();
	
	Progress* progress = copyTask->getProgress();

	// Создать список имён файлов из выделенных 
	lvi.iItem = (int) SendDlgItemMessage (hDlg, panelIdSrc, LVM_GETNEXTITEM, (WPARAM)0, (LPARAM)LVNI_SELECTED);
	if (lvi.iItem == 0) return FALSE;
	while (lvi.iItem != -1)
	{
		SendDlgItemMessage (hDlg, panelIdSrc, LVM_GETITEM, 0, (LPARAM)&lvi);
		copyTask->addFileName (((WIN32_FIND_DATA*)lvi.lParam)->cFileName);
		lvi.iItem = (int) SendDlgItemMessage (hDlg, panelIdSrc, LVM_GETNEXTITEM, (WPARAM)lvi.iItem, (LPARAM)LVNI_SELECTED);
		fileName[0] = L'\0';
	}
	
	// Папка источник
	SendDlgItemMessage (hDlg, fullPathIdSrc, WM_GETTEXT, sizeof(fileName), (LPARAM)fileName);
	copyTask->setSrcFolder (fileName);
	
	// Папка назначение
	SendDlgItemMessage (hDlg, fullPathIdDst, WM_GETTEXT, sizeof(fileName), (LPARAM)fileName);
	copyTask->setDstFolder (fileName);

	// Cоздать поток копирования в спящем состоянии
	HANDLE hCopyThread = CreateThread (NULL, NULL, moveFileWorker, copyTask, CREATE_SUSPENDED, NULL);
	if (hCopyThread == NULL) return FALSE;
	
	SetThreadPriority (hCopyThread, THREAD_PRIORITY_IDLE);
	

	// Создать диалог копирования
	LONG hInst = GetWindowLong (hDlg, GWL_HINSTANCE);
	progress->hDlg = CreateDialogParam ((HINSTANCE)hInst, MAKEINTRESOURCE(IDD_COPY_PROGRESS), hDlg, moveDlgProc, 0);
	if (progress->hDlg == NULL) return FALSE;

	SendMessage (progress->hDlg, WM_SETTEXT, 0, (LPARAM) L"Перемещение");
	
	SendDlgItemMessage (progress->hDlg, IDC_COPY_DEST, WM_SETTEXT, 0, (LPARAM)copyTask->getDstFolder());
		
	getIniFileName (fileName, sizeof (fileName));
	loadDlgItemProperties (progress->hDlg, IDD_COPY_PROGRESS, fileName);
	
	// Сохранить дескрипторы диалога копирования и потока копирования
	setOperationThread (progress->hDlg, hCopyThread, TRUE);

	// Установить флаг активности операции перемещения
	SetProp (progress->hDlg, L"running", (HANDLE) TRUE);
		
	// Запустить поток копирования
	resumeOperationThread (progress->hDlg);

	return 0;
}