티스토리 뷰
2. 스크롤 바에 컨트롤 변수를 추가한다.
CScrollBar m_ctrVScroll;
3. 스크롤 바 초기화
// 스크롤 바 의 사용영역 설정.
m_ctrVScroll.SetScrollRange(0, 100);
// 스크롤 바의 위치 설정
m_ctrVScroll.SetScrollPos(50);
// 스크롤바의 모든 정보를 한번에 설정하기
SCROLLINFO scrinfo;
scrinfo.cbSize = sizeof(scrinfo);
scrinfo.fMask = SIF_ALL;
scrinfo.nMin = 0; // 최소값
scrinfo.nMax = 100; // 최대값
scrinfo.nPage = 10; // 페이지단위 증가값
scrinfo.nTrackPos = 0; // 트랙바가 움직일때의 위치값
scrinfo.nPos = 50; // 위치
m_ctrVScroll.SetScrollInfo(&scrinfo);
4. 스크롤이 움직일때
- 대화상자의 메시지 WM_VSCROLL를 사용한다. 가로 스크롤바라면 WM_HSCROLL를 사용한다.
void CDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here and/or call default
if(pScrollBar)
{
// 스크롤 바 검사
if(pScrollBar == (CScrollBar*)&m_ctrVScroll)
{
SCROLLINFO scrinfo;
// 스크롤바 정보를 가져온다.
if(pScrollBar->GetScrollInfo(&scrinfo))
{
switch(nSBCode)
{
case SB_PAGEUP: // 스크롤 바의 위쪽 바를 클릭
scrinfo.nPos -= scrinfo.nPage;
break;
case SB_PAGEDOWN: // 스크롤 바의 아래쪽 바를 클릭
scrinfo.nPos += scrinfo.nPage;
break;
case SB_LINEUP: // 스크롤 바의 위쪽 화살표를 클릭
scrinfo.nPos -= scrinfo.nPage/10;
break;
case SB_LINEDOWN: // 스크롤 바의 아래쪽 화살표를 클릭
scrinfo.nPos += scrinfo.nPage/10;
break;
case SB_THUMBPOSITION: // 스크롤바의 트랙이 움직이고 나서
case SB_THUMBTRACK: // 스크롤바의 트랙이 움직이는 동안
scrinfo.nPos = scrinfo.nTrackPos; // 16bit값 이상을 사용
break;
}
// 스크롤바의 위치를 변경한다.
pScrollBar->SetScrollPos(scrinfo.nPos);
}
}
}
else
{
// 이 부분은 Scroll기능이 있는 뷰를 사용시 사용된다.
int ScrollPos = GetScrollPos(SB_VERT); // 세로 스크롤바 포지션 구하기
// 가로는: SB_HORZ
switch(nSBCode)
{
case SB_PAGEUP: // 스크롤 바의 위쪽 바를 클릭
case SB_PAGEDOWN: // 스크롤 바의 아래쪽 바를 클릭
case SB_LINEUP: // 스크롤 바의 위쪽 화살표를 클릭
case SB_LINEDOWN: // 스크롤 바의 아래쪽 화살표를 클릭
CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
break;
case SB_THUMBPOSITION: // 스크롤바의 트랙이 움직이고 나서
case SB_THUMBTRACK: // 스크롤바의 트랙이 움직이는 동안
scrinfo.nPos = scrinfo.nTrackPos;
// 스크롤바의 위치를 변경한다.
SetScrollPos(SB_VERT, scrinfo.nPos);
Invalidate(FALSE);
break;
}
}
//CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
}
펌: http://pyong86.tistory.com/entry/MFC-스크롤-바
내용 추가1)
스크롤바는 저걸 구현해 주지 않으면 정말 아무 동작도 하질 않는다..
처음에 레인지만 지정해주면 버튼 누를 때 알아서 bar가 움직일 줄 알았는데.. 저 위의 코드를 구현해 주지 않으면 움직이질 않는다.. 엄청 빡친다 -_-;;
내용 추가2)
스크롤바로 스크롤되는 그림 이미지를 보여 줄 경우.. 스크롤바 사이즈가 참 난해하다.
가로로 스크롤 되는 스크롤바를 만들고 nMax를 그림의 width로 주었는데.. 즉 그림의 1pixel을 스크롤바의 1range로 맞췄었는데.. 안된다.. 이유인 즉슨 그림의 끝과 스크롤바의 nPos를 맞출려면 그렇게 해주면 안되기 때문 이었다.
그래서 나온 결론은 스크롤바의 nMax를 다음과 같이 주는 것이 었다.
int nScrollBarSize = m_nSize - DISPLAY_WIDTH + m_nSize/10; //스크롤바의 크기 때문에 이렇게 조금 빼줘야 한다.
nScrollBarSize = nScrollBarSize>0?nScrollBarSize:0;
si.nMax = nScrollBarsize;
여기서 m_nSize는 그림 파일의 가로 길이이고, DISPLAY_WIDTH는 스크롤바의 가로 길이이다.(즉, 그림이 표시되는 화면의 길이)
위처럼 해주니까 딱 맞더라. 아 물론 si.nPage = m_nSize/10; 일 경우의 얘기이다.
'Development > Windows' 카테고리의 다른 글
[MFC] MFC에서 argv 받기 (0) | 2011.06.02 |
---|---|
[API/MFC] 레지스트리 읽고 쓰는 함수 (1) | 2011.06.02 |
[Visual C++] MultiByteToWideChar와 WidecharToMultiByte의 사용. (0) | 2011.05.12 |
[Visual C++] shift_jis 인코딩 문제 (0) | 2011.05.11 |
[MFC] Slider Control 사용법 (0) | 2011.02.18 |
[MFC] #define new DEBUG_NEW와 static char THIS_FILE[] = __FILE__; (0) | 2011.02.11 |
[MFC] MESSAGE MAP (0) | 2010.12.14 |
[MFC] Error: The Extender Provider failed to return an Extender for this object (0) | 2010.12.08 |
- Total
- Today
- Yesterday
- kering
- C
- db
- source
- it
- 프로그래밍
- Cloud
- database
- gcc
- MFC
- 음악
- Troubleshooting
- API
- C++
- linux
- Visual C++
- Quiz
- jni강좌
- android
- jni
- NDK
- Python
- 리눅스
- 안드로이드
- java
- driver
- AWS
- winapi
- algorithm
- 드라이버
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |