MFC Progressbar 만들기 [퍼옴]
훔.. 오늘은 progressbar를 만들어야 하는데.. ㅡ.ㅡ; 그냥.. 찾다보니.. 괜찮은 분이 올린글과.. 예제 코드가 있길래 올린다 ㅡ.ㅡ;
어쩌다 보니 직접 짜는건 없고 퍼오기만 하는것 같군 ㅜㅜ
하이튼 올려볼까??
[출처 : http://legendfinger.com]
**1. 먼저 CProgressCtrl m_wndProg; 를 선언한다.
-
상태바에 Progress 콘트롤을 올리게 하는 함수를 만듭니다.**
멤버함수를 추가한다는 것이지요.
이름은 InitProgress()로 합시다. - void CMainFrame::InitProgress()
- {
-
if (!m_wndProg.Create(WS_CHILD WS_VISIBLE, CRect(0,0,0,0), &m_wndStatusBar, ID_PROGRESS)) - {
- AfxMessageBox(“ProGress콘트롤 생성 실패!!”);
- }
- m_wndProg.SetRange(0,100);
- m_wndProg.SetPos(50);
- }
| void CMainFrame::InitProgress(){if (!m_wndProg.Create(WS_CHILD | WS_VISIBLE, CRect(0,0,0,0), &m_wndStatusBar, ID_PROGRESS)){AfxMessageBox(“ProGress콘트롤 생성 실패!!”);}m_wndProg.SetRange(0,100);m_wndProg.SetPos(50);} |
설명 : 위에서 ID_PROGRESS는 Resource Symbols에서 정의해주어야 한다.
progress 콘트롤의 범위와 위치는 일단 가정해준다. 눈으로 봐야하니까…
*3. 자!! 그다음엔 메인프레임의 OnCreate()에서 위의 함수를 호출하면 됩니다.*그렇게 했는데 눈에 안보인다구요?? 당연하지요…
왜냐하면 윈도우의 사이즈가 변할떄마다 다시 그려줘야 하잖겠어요???
해서 메인프레임의 OnSize(UINT nType, int cx, int cy)에 맵핑해줍니다.
- void CMainFrame::OnSize(UINT nType, int cx, int cy)
- {
- if (m_wndProg.m_hWnd)
- {
- CRect rc;
- m_wndStatusBar.GetItemRect(1,rc);
- m_wndProg.SetWindowPos(NULL, rc.left, rc.top, rc.Width(), rc.Height(), SWP_NOZORDER);
- }
- }
void CMainFrame::OnSize(UINT nType, int cx, int cy){if (m_wndProg.m_hWnd){CRect rc;m_wndStatusBar.GetItemRect(1,rc);m_wndProg.SetWindowPos(NULL, rc.left, rc.top, rc.Width(), rc.Height(), SWP_NOZORDER);}}
상태바의 rc를 얻어서 그 위에 Progress를 올립니다.
메인프레임의 사이즈가 변경될 때마다 말이지요…
이번것은 Progress 콘트롤이 작동할때 생기고 끝나면 사라지게 합니다.
약간은 복잡할수도 있습니다만.. 일단 따라해 보시구 궁금하면 물어주세요…앙
-
우선 기본적인 MFC의 SDI골격을 갖춘 윈도우를 Wizard를 통해 만들고 나서…
-
위저드에서 New Class를 통해 베이스클래스가 CStatusBarCtrl 인
우리가 만들 클래스 CMyStatusBar를 만듭니다.
이렇게하면 편하기 땜에 만드는 거지요..
잘 만들어졌지요?
근데 우리가 만들 클래스의 부모는 CStatusBarCtrl 잖아요..
이걸 CStatusBar로 다 바꿔주세요..
왜냐구요? 헤헤.. 지두 잘 몰라요.
어쩄거나 바꿔 주셔야합니다.
메뉴에서 EDIT인가에 Replace인가가 있죠?
우리가 만든 CMYStatusBar.h 와 CMyStatusBar.cpp 내에 있는
CStatusBarCtrl라는건 죄다 CStatusBar로 바꿔줍니다.
일일이 찾아서 해 줘도 되지만..그래도 Replace. -
그리고 난뒤 메인프레임의 헤더에 가 보면 CStatusBar m_wndStatusBar; 라는 부분이 있죠?
그걸 바꿔줍니다.
CMyStatusBar m_wndStatusBar; 로 이제 내가 만든클래스를 이용할수 있어요..
현재까지는 한게 없지요?
그냥 놔둬도 되는걸 왜 건드리는지??
하지만 이제부터입니다.
이제 상태바를 내 맘대로 조종할수 있대요..
내 클래스에 코딩함으로서 말이지요. -
내가 만든 클래스 안에 CProgressCtrl m_Prog;를 선언해줍니다.
왜냐구요?
상태바애 Progress콘트롤 올려야 하잖아요.. -
자..이제 코딩. 역시 멤버함수를 하나 만듭니다.
이름은 DisplayProgress()으로..
- void CMyStatusBar::DisplayProgress()
- {
- CRect rc;
- GetItemRect(0,rc);
- rc.left = rc.Width()/3;
-
if(!m_Prog.Create(WS_CHILD WS_VISIBLE,rc,this,IDW_PROGRESS)) - {
- AfxMessageBox(“실패”);
- return;
- }
- SetPaneText(0,”파일로딩중”);
- UpdateWindow();
- m_Prog.SetRange(0,100);
- m_Prog.SetPos(20);
- for(int i=0;i<25;i++)
- {
- ::Sleep(500);
- m_Prog.SetPos(i*4);
- }
- m_Prog.DestroyWindow();
- SetPaneText(0,”파일로드 완료”);
- }
| void CMyStatusBar::DisplayProgress(){CRect rc;GetItemRect(0,rc);rc.left = rc.Width()/3;if(!m_Prog.Create(WS_CHILD | WS_VISIBLE,rc,this,IDW_PROGRESS)){AfxMessageBox(“실패”);return;}SetPaneText(0,”파일로딩중”);UpdateWindow();m_Prog.SetRange(0,100);m_Prog.SetPos(20);for(int i=0;i<25;i++){::Sleep(500);m_Prog.SetPos(i*4);}m_Prog.DestroyWindow();SetPaneText(0,”파일로드 완료”);} |
설명 : IDW_PROGRESS는 역시 Resource Symbols에서 등록해주고..
어디서든 이 함수를 호출하면 상태바에 프로그레스가 생기고 동작하고 사라집니다.
메인프레임에서 호출하는게 좋겠죠? 상태바객체가 메인프레임에 있으니까…
m_wndStatusBar.DisplayProgress() 라고 하면 되겠죠
이상이고..
또 다른분이 올려주신 소스코드… 깨끗하네요.. ㅋㅋ [출처]http://blog.naver.com/firstzim/120042464346
(이글루스 파일 첨부, 서버 종료로 접근 불가)testprogressbar-firstzim.zip
코드 분석해 보니까.. 요지는….아래 연결시켜주는 부분과[class의 변수를 선언할때 연결해 주면 된다.]
void CTestProgressbarDlg::DoDataExchange(CDataExchange* pDX)
{
// IDC 와 변수의 상관 관계 시켜준다.
DDX_Control(pDX, IDC_PROGRESS1, m_progressCtrl);
}
m_progressCtrl.SetRange(0,30); // Progress bar 초기화 하는 부분.. 0부터 30까지 그리겠다라는거더군요. ^^;
// progress 의 초기치를 정해 준다.
m_progressCtrl.SetPos(0); // 초기에 얼마로 하겠느냐는건데.. 여기서는 0으로 했네요
그래고 m_progressCtrl.SetPos(num); num값을 넣으면 값이 커지거나 작아지네요.. 우와 같단하다 ㅡ.ㅡ\
\