/*Завдання 1. Створити програму для копіювання файлів,
програма повинна міcтити діалогове вікно з кнопкою Open,
що відкриває стандартний діалог вибору файлів та кнопкою SaveAs,
що відкриває стандартний діалог збереження файлу.
Після чого повинно запускатись копіювання файлу в окремому потоці.
Додатково. Відображати процес копіювання кожного файлу на окремому індикаторі процесу.
Передбачити неможливість повторного копіювання файлу, що вже копіюється.
*/
#include <windows.h>
#include <tchar.h>
#include <CommCtrl.h>
#include "resource.h"
#pragma warning (disable:4996)
struct CopyFileName
{
wchar_t first_file[MAX_PATH];
wchar_t second_file[MAX_PATH];
};
HWND hNoModeless;
HWND hProgressBar;
DWORD CALLBACK CopyProgressRoutine(LARGE_INTEGER liTotalFileSize,
LARGE_INTEGER liTotalBytesTransferred,
LARGE_INTEGER liStreamSize,
LARGE_INTEGER liStreamBytesTransferred,
DWORD dwStreamNumber,
DWORD dwCallbackReason,
HANDLE hSourceFile,
HANDLE hDestinationFile,
LPVOID lpvData)
{
HWND lpProgressCtrl = (HWND)lpvData;
SendMessage(lpProgressCtrl, PBM_SETPOS, (liTotalBytesTransferred.QuadPart / liTotalFileSize.QuadPart * 100), 0);
SendMessage(lpProgressCtrl, PBM_STEPIT, 0, 0);
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
if (!IsDialogMessage(hNoModeless, &msg))
{
//TranslateMessage(&msg); - обробка даних від клавіатури
DispatchMessage(&msg);
}
}
return PROGRESS_CONTINUE;
}
BOOL CALLBACK ModelessDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_INITDIALOG:
/*hProgressBar = CreateWindow(PROGRESS_CLASS, NULL, WS_CHILD | WS_VISIBLE, 20, 60, 350, 30, hWnd, NULL, GetModuleHandle(NULL), NULL);
SendMessage(hProgressBar, PBM_SETRANGE, 0, MAKELPARAM(0, 100));
SendMessage(hProgressBar, PBM_SETSTEP, 1, 0);
SendMessage(hProgressBar, PBM_SETPOS, 0, 0);*/
ShowWindow(hProgressBar, SW_SHOW);
return 1;
case WM_CLOSE:
DestroyWindow(hWnd);
hNoModeless = nullptr;
hProgressBar = nullptr;
return 1;
}
return 0;
}
DWORD WINAPI CopyThread(PVOID pvParam)
{
CopyFileName* temp_files = (CopyFileName*)pvParam;
//Create modeless dialog
hNoModeless = CreateDialog(GetModuleHandle(NULL),MAKEINTRESOURCE(IDD_DIALOG2), GetDlgItem(NULL, IDD_DIALOG1), ModelessDlgProc);
ShowWindow(hNoModeless, SW_SHOW);
//--------------------
//Init ProgressBar
hProgressBar = CreateWindow(PROGRESS_CLASS, NULL, WS_CHILD | WS_VISIBLE, 20, 60, 350, 30, hNoModeless, NULL, GetModuleHandle(NULL), NULL);
SendMessage(hProgressBar, PBM_SETRANGE, 0, MAKELPARAM(0, 100));
SendMessage(hProgressBar, PBM_SETSTEP, 1, 0);
SendMessage(hProgressBar, PBM_SETPOS, 0, 0);
//--------------------
CopyFileEx(temp_files->first_file, temp_files->second_file, CopyProgressRoutine, &hProgressBar, FALSE, COPY_FILE_FAIL_IF_EXISTS);
return 0;
}
BOOL CALLBACK DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
static OPENFILENAME ofn;
static wchar_t file[MAX_PATH] = L"\0";
static wchar_t buff[MAX_PATH] = L"\0";
static DWORD dwFileSize = 0, bytesToRead = 0, bytesRead = 0;
CopyFileName* files_name = new CopyFileName;
switch (uMsg)
{
case WM_INITDIALOG:
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hWnd;
ofn.lpstrFile = file;
ofn.lpstrFilter = L"All\0*.*\0";
ofn.nFilterIndex = 1;
ofn.nMaxFile = MAX_PATH;
return 1;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDC_OPEN:
if (GetOpenFileName(&ofn))
{
if (lstrcmp(ofn.lpstrFile, buff) == 0)
MessageBox(NULL, L"This file is copying", L"Error", MB_OK|MB_ICONERROR);
else
lstrcpy(buff, ofn.lpstrFile);
break;
}
case IDC_SAVE_AS:
if (GetSaveFileName(&ofn))
{
lstrcpy(files_name->second_file, ofn.lpstrFile);
lstrcpy(files_name->first_file, buff);
CreateThread(NULL, 0, CopyThread, files_name, NULL, NULL);
break;
}
}
return 1;
case WM_CLOSE:
EndDialog(hWnd, 0);
return 1;
}
delete files_name;
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR nCmd, int nCmdShow)
{
INITCOMMONCONTROLSEX cc;
cc.dwSize = sizeof(INITCOMMONCONTROLSEX);
cc.dwICC = ICC_WIN95_CLASSES;
InitCommonControlsEx(&cc);
DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc);
return 0;
}