CDialog-derived 에서뿐만이 아니라, SDI나 MDI에서도 동적으로든 정적으로든 CScrollBar를 쓰게 될 때,
scrollbar에서 오는 message를 일일이 작성해 줄 때가 있는데, 다음과 같은 코드가 자주 사용된다.
void CTestView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// scroll 되기 전의 위치를 저장해 놓는다.
UINT nOldPos = pScrollBar->GetScrollPos();
int diff = 0; // scroll 될 정도
switch(nSBCode){
// 왼쪽이 눌리면 예전 값에서 1을 뺀다.
case SB_LINELEFT: diff = -1; break;
// PAGE의 경우, 100 을 뺀다. 이 경우,
// 현재 내가 scroll range를
// [0, 1000] 으로 해 놓아서, 이 값의 10%인 100 을 설정한 것이다.
// 대개 [0,100] 으로
// scroll range를 설정해 놓으면, PAGE의 경우 10 만큼 변환시키곤 한다.
case SB_PAGELEFT: diff = -100; break;
case SB_LINERIGHT: diff = 1; break;
case SB_PAGERIGHT: diff = 100; break;
}
UINT nCurrentPos = nOldPos + diff;
// thumb을 옮기고 있는 중이라면 [nPos] 값이 현재 위치가 된다.
if(nSBCode == SB_THUMBTRACK){
nCurrentPos = nPos;
}
// thumb의 위치를 새로 옮겨 준다.
// 델파이나 비베랑은 달리
// C++ 에서는 이런 거 일일이 다 해줘야 한다는.
pScrollBar->SetScrollPos(nCurrentPos);
// 여기서 각 scrollbar에 적당한 추가 작업을 한다.
std::map<CScrollBar*,double*>::iterator find_pos;
find_pos = _scb2value.find(pScrollBar);
if(find_pos != _scb2value.end()){
double min_value = _var2min[find_pos->second];
double max_value = _var2max[find_pos->second];
double real_value = (nCurrentPos/1000.0)*(max_value - min_value) + min_value;
*(find_pos->second) = real_value;
Simulate();
}
CView::OnHScroll(nSBCode, nCurrentPos, pScrollBar);
}
{
// scroll 되기 전의 위치를 저장해 놓는다.
UINT nOldPos = pScrollBar->GetScrollPos();
int diff = 0; // scroll 될 정도
switch(nSBCode){
// 왼쪽이 눌리면 예전 값에서 1을 뺀다.
case SB_LINELEFT: diff = -1; break;
// PAGE의 경우, 100 을 뺀다. 이 경우,
// 현재 내가 scroll range를
// [0, 1000] 으로 해 놓아서, 이 값의 10%인 100 을 설정한 것이다.
// 대개 [0,100] 으로
// scroll range를 설정해 놓으면, PAGE의 경우 10 만큼 변환시키곤 한다.
case SB_PAGELEFT: diff = -100; break;
case SB_LINERIGHT: diff = 1; break;
case SB_PAGERIGHT: diff = 100; break;
}
UINT nCurrentPos = nOldPos + diff;
// thumb을 옮기고 있는 중이라면 [nPos] 값이 현재 위치가 된다.
if(nSBCode == SB_THUMBTRACK){
nCurrentPos = nPos;
}
// thumb의 위치를 새로 옮겨 준다.
// 델파이나 비베랑은 달리
// C++ 에서는 이런 거 일일이 다 해줘야 한다는.
pScrollBar->SetScrollPos(nCurrentPos);
// 여기서 각 scrollbar에 적당한 추가 작업을 한다.
std::map<CScrollBar*,double*>::iterator find_pos;
find_pos = _scb2value.find(pScrollBar);
if(find_pos != _scb2value.end()){
double min_value = _var2min[find_pos->second];
double max_value = _var2max[find_pos->second];
double real_value = (nCurrentPos/1000.0)*(max_value - min_value) + min_value;
*(find_pos->second) = real_value;
Simulate();
}
CView::OnHScroll(nSBCode, nCurrentPos, pScrollBar);
}
'컴퓨터 > MFC_API' 카테고리의 다른 글
CTreeCtrl 에서 check box를 집어 넣고 다루기 (1) | 2009.12.27 |
---|---|
프로그램이 플로피 디스크를 읽는 것 방지 (0) | 2009.12.27 |
저장하기 대화 상자 열기 (0) | 2009.12.14 |
클립보드(clipboard) 내용 가져오기 (0) | 2009.12.09 |
CListCtrl의 Report 형식에서, 선택된 모든 항목 삭제하기 (0) | 2009.12.09 |