그래야 ProgressBar에 진행률을 표시할 수 있을테니까요~
그리고,
CopyFileEx()를 통하더라도 진행률을 나타내는 다이얼로그가 Invalidate가 제대로 이루어지지 않습니다. 복사 동안은 윈도우메시지를 받지 못하기 때문이겠죠.
그래서 이를 쓰레드로 다시 싸는 작업을 해야합니다.
대충 다음과 같은 코드들이 쓰이게 됩니다.
DWORD CALLBACK CopyProgressRoutine(LARGE_INTEGER TotalFileSize,
LARGE_INTEGER TotalBytesTransferred,
LARGE_INTEGER StreamSize,
LARGE_INTEGER StreamBytesTransferred,
DWORD dwStreamNumber,
DWORD dwCallbackReason,
HANDLE hSourceFile,
HANDLE hDestinationFile,
LPVOID lpData)
{
CCopyFileProgressDlg* pDlg = (CCopyFileProgressDlg*)lpData;
if (!pDlg || pDlg->m_bStop)
return PROGRESS_STOP;
pDlg->UpdateProgressbar(PROGRESSVALUE(TotalBytesTransferred.QuadPart, TotalFileSize.QuadPart));
if (PROGRESSVALUE(TotalBytesTransferred.QuadPart, TotalFileSize.QuadPart) < 100)
return PROGRESS_CONTINUE;
return PROGRESS_STOP;
}
DWORD WINAPI CopyFileThread(LPVOID lParam)
{
CCopyFileProgressDlg* pDlg = (CCopyFileProgressDlg*)lParam;
if (!pDlg)
return 0;
BOOL bCancel = FALSE;
::CopyFileEx(pDlg->m_strSrcPath, pDlg->m_strDestPath, &CopyProgressRoutine, pDlg, &bCancel, /*COPY_FILE_FAIL_IF_EXISTS*/0);
if (pDlg->m_bStop)
return 0;
if (pDlg && pDlg->GetSafeHwnd())
pDlg->PostMessage(WM_CLOSE);
return 0;
}
…
DWORD dwThreadId;
m_hThread = CreateThread(NULL, // pointer to security attributes
0, // initial thread stack size
CopyFileThread, // pointer to thread function
this, // argument for new thread
0, // creation flags
&dwThreadId // pointer to receive thread ID
);
'C & C++ > C & C++' 카테고리의 다른 글
[Tip] 모니터 해상도 구하기 (0) | 2011.03.31 |
---|---|
[Tip] Sleep() 함수 대신 프로그램 딜레이 시키기 (0) | 2011.03.31 |
[Tip] 에러 메시지 얻기 (0) | 2011.03.29 |
파일 저장하기 (0) | 2011.03.29 |
[ClipBoard] 클립보드 내용가져오기 (0) | 2011.03.29 |
댓글