티스토리 뷰
MFC 스핀 버튼 컨트롤
업다운(Up-Down) 컨트롤이라 부르기도 한다.
독립적으로 사용되기보다 다른 컨트롤(버디(Buddy) 컨트롤이라 부름)과 함께 사용하는데 주로 편집 컨트롤 또는 정적 텍스트 컨트롤 등이 버디 컨트롤이 된다.
1. 스타일
- Orientation
화살표의 방향을 결정하며, 수직 또는 수평을 선택할 수 있다.
- Alignment
버디 컨트롤의 왼쪽 또는 오른쪽에 지동으로 붙도록 할 수 있으며, 기본값은 붙지 않는다.
- Auto buddy
탭 순서가 스핀 버튼 컨트롤 바로 앞에 해당하는 컨트롤이 자동으로 버디가 된다.
- Set buddy integer
스핀 버튼 컨트롤의 위치 값이 버디 컨트롤에 자동으로 표시된다.
- No thousands
버디 컨트롤에 표시되는 숫자에서 천 단위 표시(,)를 생략한다.
- Wrap
위치 값이 증가하다가 최대가 되면 자동으로 최소로 되돌아 간다. 그 반대의 경우도 마찬가지다.
- Arrow keys
상하 화살표 키를 이용하여 값을 증감할 수 있도록 한다.
- Hot track
마우스 커서가 지나가면 스핀 버튼 컨트롤의 화살표 색상이 바뀐다.
2. 스핀 버튼 컨트롤 클래스
- 범위 설정과 현재 범위 얻기
void CSpinButtonCtrl::SetRange(short nLower, short nUpper);
void CSpinButtonCtrl::GetRange(int& lower, int& upper);
기본값은 100~0 (0~100 아님) 으로 설정되어 있으므로 사용하기 전에 반드시 최소, 최대 범위를 설정해야 한다.
- 위치 설정과 현재 위치 얻기
int CSpinButtonCtrl::SetPos(int nPos);
int CSpinButtonCtrl::GetPos();
nPos : SetRange()로 정한 범위에 속해야 한다.
- 버디 설정
CWnd* CSpinButtonCtrl::SetBuddy(CWnd* pWndBuddy);
탭 순서를 정하지 않고 이 함수로 버디 컨트롤을 설정할 수 있다.
pWndBuddy : 버디 컨트롤에 대한 CWnd형 포인터
- 숫자의 진수 변경
int CSpinButtonCtrl::SetBase(int nBase);
nBase : 16을 사용하면 숫자가 16진수로 표시된다.
스핀 버튼 컨트롤을 마우스로 조작하면 WM_VSCROLL, WM_HSCROLL 메시지가 발생하며, 현재의 위치값이 메시지와 더불어 부모 윈도우에게 전달된다.
24행 처럼 스핀 버튼 컨트롤에서 스크롤된건지 확인해줘야 한다.
Auto buddy : True
Set buddy integer : True 로 속성 지정한다.
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 |
class CMFCApplication15View : public CFormView
{
...
CSpinButtonCtrl m_spin;
afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
};
BEGIN_MESSAGE_MAP(CMFCApplication15View, CFormView)
ON_WM_VSCROLL()
END_MESSAGE_MAP()
void CMFCApplication15View::OnInitialUpdate()
{
CFormView::OnInitialUpdate();
GetParentFrame()->RecalcLayout();
ResizeParentToFit();
m_spin.SetRange(0, 100);
m_spin.SetPos(0);
}
void CMFCApplication15View::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
if (pScrollBar->GetSafeHwnd() == m_spin.GetSafeHwnd())
{
CString str;
str.Format(L"%d", nPos);
AfxGetMainWnd()->SetWindowTextW(str);
}
CFormView::OnVScroll(nSBCode, nPos, pScrollBar);
} |
cs |