[MFC] 윈도우 프로그래밍 기초 - 프로그래스 컨트롤
프로그래스 컨트롤은 아래와 같이 진행되고 있는 데이터의 상태를 보여주기 위해 사용하는 컨트롤입니다.
(윈도우 탐색기의 프로그래스 컨트롤)
프로그래스 컨트롤이 어떠한 원리로 사용되는지 소개하겠습니다.
1. 배경지식
1. CProgressCtrl 클래스
a) CProgressCtrl의 멤버 함수
* GetPos( ) int GetPos( ) ;
-> Return 값 : 현재 Position 값
|
* GetRange( ) void GetRange( int & nLower, int & nUpper)
-> nLower : 영역의 최저 값을 받을 int 형 변수 nUpper : 영역의 최대 값을 받을 int 형 변수
|
* SetBkColor COLORREF SetBkColor( COLORREF clrNew ) ;
-> clrNew : 프로그래스 컨트롤의 배경색으로 지정할 색상 값 Return 값 : 변경하기 전의 배경색 색상 값
|
* SetPos int SetPos( int nPos );
-> nPos : 프로그래스 바의 포지션을 변경할 값 Return 값 : 변경하기 전의 프로그래스 바의 포지션 값
|
* SetRange void SetRange( short nLower, short nUpper ) ;
void SetRange32 ( int nLower, int nUpper ) ;
-> nLower : 프로그래스 바의 최저 값 (색이 채워지지 않는 값) nUpper : 프로그래스 바의 최대 값 (색을 모두 채우는 값)
최저값 : 0 최대값 : 100까지
|
2. 결과물
오늘의 실습 주제 : 파일 복사 프로그래스로 측정해보기
|
결과물 |
버튼 - 원본파일) 찾아보기 |
버튼 - 복사 경로) 찾아보기 |
| |
버튼 - 파일 복사) 클릭시 결과 | |
| |
곰돌이.mp3 복사된 것을 확인 할 수 있음. |
3. 레이아웃 디자인
변수 설정할 부분만 설명해놨습니다.
버튼은 여러분이 이벤트 처리기로 하시면 됩니다. (이 부분은 여러분의 감각 믿습니다.)
컨트롤 |
캡션 |
범주(T) |
변수 이름(N) |
택스트 컨트롤 |
X |
Value |
m_original |
택스트 컨트롤 |
X |
Value |
m_copydir |
프로그래스 |
X |
Control |
m_progress |
4. 소스코드
// CProgressDlg.h : 헤더 파일 #pragma once
#define PROGRESSVALUE(a, b) (int)((double)( a * 100 ) / (double) b )
// 이 부분은 메크로 함수로 PROGRESS 값을 반환하도록 했는데, 여러분이 함수형으로 구현하셔도 되고 상관없습니다. |
CProgressDlg.h |
CFileDialog dlg(TRUE, _T("*"), _T("*.*"), OFN_FILEMUSTEXIST | OFN_HIDEREADONLY, szFilter);
if (dlg.DoModal() == IDOK) // 데이터 갱신 } |
원본 파일 찾기 - 구현 |
CFileDialog dlg(FALSE, _T("*"), _T("*.*"), OFN_FILEMUSTEXIST | OFN_HIDEREADONLY, szFilter);
if (dlg.DoModal() == IDOK) // 데이터 갱신 } |
복사 경로 찾기 - 구현 |
// 파일 복사 DWORD CALLBACK buksa( ) DWORD CALLBACK buksa(LARGE_INTEGER TotalFileSize,
int pos = PROGRESSVALUE( TotalBytesTransferred.QuadPart,
// Pos 설정
// 100 퍼센트 전송되지 않을 때
// 100 퍼센트 전송되었을 때
return PROGRESS_QUIET; } |
이 부분 원형은 외우지 말 것 (파일 복사 Routine 때문에 구현) |
// 대상 파일 복사
// 복사 진행 |
대상 파일 복사 |
소스코드 : CProgress.zip
이번 글은 약간 어려울 수 있는데, 별거 없습니다.
특히나 DWORD CALLBACK buksa( ) 의 경우 WinBase.h 정의로 이동해서 그대로 가져다가 사용하면 저 원형 그대로 사용할 수 있습니다.
이번 글에서 의도한 것은 기본적인 부분은 프로그래스를 사용하실 수 있게 해드리는 것이고, 두 번째로 코드는 힘들게 외우지 말라는 것을
알려드리고 싶어서 아래의 자료와 함께 올려드렸습니다.
아래의 자료는 MSDN의 CopyFileEx와 CopyRoutine 원형의 설명이 담긴 자료입니다.
저 설명은 다 외우지 말고 여러분이 원하는 방법으로 변경할 때 참고하시면 됩니다.
5. 참고사항1) CopyFileEx
|
CopyFileEx 함수 원형 |
파라메터 |
설명 |
lpExistingFileName |
원본 파일 지정 |
lpNewFileName |
새로 복사할 위치 지정 |
lpProgressRoutine |
파일 복사 콜백 함수(Routine 함수 지정) |
lpData |
부모 함수를 포인터로 전달할 것인지에 대한 판단 (ex : this (자기 자신을 함수 포인터로 전달) |
dwCopyFlags |
복사 플래그 지정 |
* dwCopyFlags
Flags that specify how the file is to be copied. This parameter can be a combination of the following values.
6. 참고사항2) CopyProgressRoutine
CopyProgressRoutine callback function
An application-defined callback function used with the CopyFileEx, MoveFileTransacted, and MoveFileWithProgress functions. It is called when a portion of a copy or move operation is completed. The LPPROGRESS_ROUTINE type defines a pointer to this callback function. CopyProgressRoutine is a placeholder for the application-defined function name.
Syntax
DWORD CALLBACK CopyProgressRoutine(
_In_ LARGE_INTEGER TotalFileSize,
_In_ LARGE_INTEGER TotalBytesTransferred,
_In_ LARGE_INTEGER StreamSize,
_In_ LARGE_INTEGER StreamBytesTransferred,
_In_ DWORD dwStreamNumber,
_In_ DWORD dwCallbackReason,
_In_ HANDLE hSourceFile,
_In_ HANDLE hDestinationFile,
_In_opt_ LPVOID lpData
);
typedef DWORD (WINAPI *LPPROGRESS_ROUTINE)(
_In_ LARGE_INTEGER TotalFileSize,
_In_ LARGE_INTEGER TotalBytesTransferred,
_In_ LARGE_INTEGER StreamSize,
_In_ LARGE_INTEGER StreamBytesTransferred,
_In_ DWORD dwStreamNumber,
_In_ DWORD dwCallbackReason,
_In_ HANDLE hSourceFile,
_In_ HANDLE hDestinationFile,
_In_opt_ LPVOID lpData
);
Parameters
- TotalFileSize [in]
-
The total size of the file, in bytes.
- TotalBytesTransferred [in]
-
The total number of bytes transferred from the source file to the destination file since the copy operation began.
- StreamSize [in]
-
The total size of the current file stream, in bytes.
- StreamBytesTransferred [in]
-
The total number of bytes in the current stream that have been transferred from the source file to the destination file since the copy operation began.
- dwStreamNumber [in]
-
A handle to the current stream. The first time CopyProgressRoutine is called, the stream number is 1.
- dwCallbackReason [in]
-
The reason that CopyProgressRoutine was called. This parameter can be one of the following values.
-
- hSourceFile [in]
-
A handle to the source file.
- hDestinationFile [in]
-
A handle to the destination file
- lpData [in, optional]
-
Argument passed to CopyProgressRoutine by CopyFileEx, MoveFileTransacted, or MoveFileWithProgress.
Return value
The CopyProgressRoutine function should return one of the following values.
Return code/value | Description |
---|---|
|
Cancel the copy operation and delete the destination file. |
|
Continue the copy operation. |
|
Continue the copy operation, but stop invoking CopyProgressRoutine to report progress. |
|
Stop the copy operation. It can be restarted at a later time. |
Remarks
An application can use this information to display a progress bar that shows the total number of bytes copied as a percent of the total file size.
Requirements
Minimum supported client |
Windows XP [desktop apps only] |
---|---|
Minimum supported server |
Windows Server 2003 [desktop apps only] |
Header |
|
7. 참고자료(Reference)
1. https://msdn.microsoft.com/en-us/library/windows/desktop/aa363852(v=vs.85).aspx, 접속일자 2015-03-31
2. https://msdn.microsoft.com/en-us/library/windows/desktop/aa363854(v=vs.85).aspx, 접속일자 2015-03-31
'소프트웨어(SW) > MS - C++ (GUI) MFC' 카테고리의 다른 글
[MFC] 윈도우 프로그래밍 기초 - 트리 컨트롤 (7) | 2015.04.02 |
---|---|
[MFC] 윈도우 프로그래밍 기초 - 순수한 List Control 배우기 (1) | 2015.04.01 |
[MFC] 윈도우 프로그래밍 기초 - 공통 컨트롤의 이해? (1) | 2015.03.31 |
[MFC] 윈도우 프로그래밍 기초 - 폰트 대화상자(CFontDialog) (1) | 2015.03.31 |
[MFC] 윈도우 프로그래밍 기초 - 쉬어가는 코너 (읽는 방법의 여러 종류) (1) | 2015.03.27 |