2010년 10월 22일 금요일

[스크롤바-기초04] 응용: 간단한 색상 보기

지금까지 진행한 내용을 바탕으로 간단한 색상보기 샘플을 제작해 보겠습니다.
실행한 모양은 아래 처럼 됩니다.



설정 조건
1. 스크롤바를 3개 만들고 모든 범위는 0 - 255 까지이다.
2. 각각 좌측부터 Red, Green, Blue의 삼원색을 제어한다.
3. 오른쪽 사각영역에 주어진 RGB 컬러대로 색칠을 해준다.

-----------------------------------------------------------------------------------
허데 파일의 내용.. 발췌

// Dialog Data
    //{{AFX_DATA(CSampleDlg)

    enum { IDD = IDD_SAMPLE_DIALOG };
    CScrollBar m_scroll3;
    CScrollBar m_scroll2;
    CScrollBar m_scroll;

    //}}AFX_DATA

    // 색칠할 사각형 영역
    CRect m_rect;
    // 색상값
    COLORREF m_rgb;
    void ChangeColorBox(CScrollBar* pBar, UINT nPos);

-----------------------------------------------------------------------------------
소스 파일의 내용.. 발췌

// RGB 단위 값의 최소/최대
#define SCROLL_MIN  0
#define SCROLL_MAX  255

// COLORREF의 부분값을 변경하기 위한 제작된 매크로
#define
SetRValue(rgb, r)      ((rgb&=0xFFFFFF00)|=(BYTE)r)
#define SetGValue(rgb, g)      ((rgb&=0xFFFF00FF)|=((BYTE)g)<<8)
#define SetBValue(rgb, b)      ((rgb&=0xFF00FFFF)|=((BYTE)b)<<16)

BOOL CSampleDlg::OnInitDialog()
{
    CDialog::OnInitDialog();

    // 스크롤바와 연결된 컨트롤 3개에 대하여 모두 기본값들을 설정한다.
    m_scroll.SetScrollRange(SCROLL_MIN, SCROLL_MAX);
    m_scroll.SetScrollPos(0);
    m_scroll.EnableScrollBar(ESB_ENABLE_BOTH);
 
    m_scroll2.SetScrollRange(SCROLL_MIN, SCROLL_MAX);
    m_scroll2.SetScrollPos(0);
    m_scroll2.EnableScrollBar(ESB_ENABLE_BOTH);
 
    m_scroll3.SetScrollRange(SCROLL_MIN, SCROLL_MAX);
    m_scroll3.SetScrollPos(0);
    m_scroll3.EnableScrollBar(ESB_ENABLE_BOTH);
 
    // 화면에 그릴 영역의 사각 크기를 구한다.
    GetDlgItem(IDC_STATIC1)->GetWindowRect(m_rect);
    ScreenToClient(m_rect);

    // 기본 색상은 검은색이다.
    m_rgb = RGB(0,0,0);

    return TRUE;
}

// 정해진 색상으로 지정된 위치에 색칠한다.

void CSampleDlg::OnPaint()
{
    CPaintDC dc(this);
    dc.FillSolidRect(m_rect, m_rgb);
}

// 스크롤 이벤트 핸들러
void CSampleDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
    if(!pScrollBar || !pScrollBar->m_hWnd)
        return;

    UINT nCurPos = pScrollBar->GetScrollPos();
    switch(nSBCode)
    {
    case SB_BOTTOM:
        pScrollBar->SetScrollPos(SCROLL_MAX);
        break;

    // 중간 생략...

     case SB_TOP:
        pScrollBar->SetScrollPos(SCROLL_MIN);
        break;
    }
 
    // 색상값에 변경이 있으면 다시 색칠을 해야지..
   ChangeColorBox(pScrollBar, nCurPos);

    CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
}

// 색상값이 변경되면 어떤 스크롤바가 값이 얼마인지 계산을 해서
// RGB를 다시 계산한 후 색칠한다.

void CSampleDlg::ChangeColorBox(CScrollBar* pBar, UINT nPos)
{
    UINT nID = pBar->GetDlgCtrlID();
    switch(nID)
    {
    case IDC_SCROLLBAR5:
        SetRValue(m_rgb, nPos);
        break;
    case IDC_SCROLLBAR6:
        SetGValue(m_rgb, nPos);
        break;
    case IDC_SCROLLBAR7:
        SetBValue(m_rgb, nPos);
        break;
    }

    CClientDC dc(this);
    dc.FillSolidRect(m_rect, m_rgb);
}




이렇게 간단하게 나마 스크롤바에 대하여 공부해 보았습니다.
실상 알고 보면 크게 어렵거나 한 부분은 거의 없습니다. 자료가 부족할 뿐 ^^;

다음에는 리스트 컨트를을 진행해 보도록 하겠습니다.
즐거운 한주 되세요.. ^^;

댓글 없음:

댓글 쓰기