WTL¿¡¼­´Â Ç¥ÁØ ÄÁÆ®·ÑÀÇ ½ºÅ©·Ñ ¹Ù ÄÁÆ®·ÑÀ» CScrollBarT À̶ó°í ÇÏ´Â ÅÛÇø´ Ŭ·¡½º¿¡¼­ ĸ½¶È­Çϰí ÀÖ½À´Ï´Ù.  ÅÛÇø´ Àμö¿¡´Â Ŭ·¡½º¸¦ ÁöÁ¤ÇÕ´Ï´Ù¸¸  ±× Ŭ·¡½º´Â CScrollBarT Ŭ·¡½ºÀÇ base class·Î¼­ »ç¿ëµË´Ï´Ù.  atlctrls.h Çì´õ¿¡¼­´Â typedef¿¡ ÀÇÇØ ´ÙÀ½°ú °°ÀÌ ¼±¾ðµÇ°í ÀÖ½À´Ï´Ù.

// atlctrls.h

typedef CScrollBarT<ATL::CWindow>   CScrollBar;

                      


À̰ÍÀº CScrollBar Ŭ·¡½º´Â CWindow Ŭ·¡½ºÀÇ »ó¼Ó Ŭ·¡½ºÀÎ °ÍÀ» ÀǹÌÇÕ´Ï´Ù.

¡¡WTLÀÇCScrollBarŬ·¡½º´Â MFCÀÇ µ¿¸íÀÇ Å¬·¡½º¿Í °ÅÀÇ °°Àº ¸â¹ö ÇÔ¼ö¸¦ ÁغñÇØ ÀÖ½À´Ï´Ù. ÀÌÇÏ¿¡ ³ªÅ¸³»´Â °ÍÀº CScrollBar Ŭ·¡½º¸¦ »ç¿ëÇÏ´Â ¿¹ÀÔ´Ï´Ù.  RGB°¢°¢ÀÇ ½ºÅ©·Ñ ¹Ù¸¦ Á¶ÀÛÇØ »öÀ» ÀÛ¼ºÇÕ´Ï´Ù.

 

// stdafx.h

#include <atlbase.h>

#include <atlapp.h>

extern CAppModule _Module;

#include <atlwin.h>

 

#include <atlcrack.h>

#include <atlmisc.h>

#include <atlctrls.h>  // ÄÁÆ®·Ñ¿ë Ŭ·¡½º¸¦ »ç¿ëÇϱâ À§ÇØ

                      

 

// maindlg.h

class CMainDlg : public CDialogImpl<CMainDlg>

{

public:

    enum { IDD = IDD_MAINDLG };

 

    CScrollBar m_scroll_r;    // [R]½ºÅ©·Ñ ¹Ù

    CScrollBar m_scroll_g;    // [G]½ºÅ©·Ñ ¹Ù

    CScrollBar m_scroll_b;    // [B]½ºÅ©·Ñ ¹Ù

 

    CRect m_rect;             // »ö Ç¥½Ã¿ë ±¸Çü

 

    // ¸Þ¼¼Áö ¸Ê

    BEGIN_MSG_MAP_EX(CMainDlg)

        MSG_WM_PAINT(OnPaint)

        MSG_WM_HSCROLL(OnHScroll)

        MSG_WM_INITDIALOG(OnInitDialog)

        COMMAND_ID_HANDLER_EX(IDOK, OnOK)

        COMMAND_ID_HANDLER_EX(IDCANCEL, OnCancel)

    END_MSG_MAP()

 

    LRESULT OnInitDialog(HWND hWnd, LPARAM lParam){

        // ½ºÅ©¸°ÀÇ Áß¾Ó¿¡ ¹èÄ¡

        CenterWindow();

 

        // Å« ¾ÆÀÌÄÜ ¼³Á¤

        HICON hIcon = AtlLoadIconImage(IDR_MAINFRAME, LR_DEFAULTCOLOR,

            ::GetSystemMetrics(SM_CXICON), ::GetSystemMetrics(SM_CYICON));

        SetIcon(hIcon, TRUE);

       

        // ÀÛÀº ¾ÆÀÌÄÜ ¼³Á¤

        HICON hIconSmall = AtlLoadIconImage(IDR_MAINFRAME, LR_DEFAULTCOLOR,

            ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON));

        SetIcon(hIconSmall, FALSE);

 

        // ÄÁÆ®·Ñ ¼³Á¤

        m_scroll_r = GetDlgItem(IDC_SCROLLBAR_R);

        m_scroll_g = GetDlgItem(IDC_SCROLLBAR_G);

        m_scroll_b = GetDlgItem(IDC_SCROLLBAR_B);

 

        // ½ºÅ©·Ñ ¹ÙÀÇ ¹üÀ§ ¼³Á¤

        m_scroll_r.SetScrollRange(0, 255);

        m_scroll_g.SetScrollRange(0, 255);

        m_scroll_b.SetScrollRange(0, 255);

 

        // ½ºÅ©·Ñ ¹ÙÀÇ Ãʱâ À§Ä¡ ¼³Á¤

        m_scroll_r.SetScrollPos(0);

        m_scroll_g.SetScrollPos(0);

        m_scroll_b.SetScrollPos(0);

 

        // »ö Ç¥½Ã¿ë ±¸ÇüÀ» Ãëµæ

        CStatic view = GetDlgItem(IDC_STATIC_VIEW);

        view.GetWindowRect(m_rect);

        ScreenToClient(m_rect);

 

        return TRUE;

    }

 

    void OnHScroll(int nSBCode, short nPos, HWND hWnd){

        // Á¶ÀÛµÈ ½ºÅ©·Ñ ¹ÙÀÇ ÇöÀç À§Ä¡¸¦ Ãëµæ

        CScrollBar scroll = hWnd;

        int color = scroll.GetScrollPos();

 

        switch(nSBCode){

        case SB_PAGELEFT:

            color -= 15;

        case SB_LINELEFT:

            color = max(0, color - 1);

            break;

        case SB_PAGERIGHT:

            color += 15;

        case SB_LINERIGHT:

            color = min(255, color + 1);

            break;

        case SB_LEFT:

            color = 0;

            break;

        case SB_RIGHT:

            color = 255;

            break;

        case SB_THUMBPOSITION:

        case SB_THUMBTRACK:

            color = nPos;

            break;

        }

 

        // »õ·Î¿î À§Ä¡·Î ¼³Á¤

        scroll.SetScrollPos(color);

 

        // »ö Ç¥½Ã¿ë ±¸ÇüÀ» °»½Å

        InvalidateRect(m_rect);

    }

 

    void OnPaint(HDC /*hDC*/){

        CPaintDC dc(m_hWnd);

 

        CBrush brush;

        brush.CreateSolidBrush(RGB(m_scroll_r.GetScrollPos(),

            m_scroll_g.GetScrollPos(), m_scroll_b.GetScrollPos()));

 

        dc.FillRect(m_rect, brush);

    }

 

    void OnOK(UINT uNotifyCode, int nID, HWND hWndCtl){

        EndDialog(nID);

    }

 

    void OnCancel(UINT uNotifyCode, int nID, HWND hWndCtl){

        EndDialog(nID);

    }

};

                      

 

// Control.cpp

#include "stdafx.h"

 

#include "resource.h"

 

#include "maindlg.h"

 

CAppModule _Module;

 

int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE, LPTSTR lpCmdLine, int nCmdShow)

{

    HRESULT hRes = ::CoInitialize(NULL);

    ATLASSERT(SUCCEEDED(hRes));

 

    ::DefWindowProc(NULL, 0, 0, 0L);

 

    AtlInitCommonControls(ICC_COOL_CLASSES | ICC_WIN95_CLASSES);

 

    hRes = _Module.Init(NULL, hInstance);

    ATLASSERT(SUCCEEDED(hRes));

 

    int nRet = 0;

    // BLOCK: ¾îÇø®ÄÉÀÌ¼Ç ½ÇÇà

    {

        CMainDlg dlgMain;

        nRet = dlgMain.DoModal();

    }

 

    _Module.Term();

    ::CoUninitialize();

 

    return nRet;

}

                      


¡¡¿ì¼±  ÀÚ¿øÀ» ÀÛ¼ºÇÕ´Ï´Ù. ´ÙÀ̾ó·Î±×¿¡ ½ºÅ©·Ñ ¹Ù ÄÁÆ®·Ñ°ú ½ºÅÂÆ½ ÄÁÆ®·ÑÀ» ¹èÄ¡ÇØ  ÀÚ¿ø ID¸¦ ´ÙÀ½°ú °°ÀÌ ÁöÁ¤ÇÕ´Ï´Ù. µ¡ºÙ¿© »ö Ç¥½Ã¿ëÀÇ ½ºÅÂÆ½ ÄÁÆ®·ÑÀÇ ÇÁ·ÓÆÛƼ¿¡¼­´Â[°¡½Ã]ÀÇ Ã¼Å©¸¦ ¶Á´Ï´Ù.

ÄÁÆ®·Ñ¸í

ÀÚ¿øID

½ºÅ©·Ñ ¹Ù([R]¿ë)

IDC_SCROLLBAR_R

½ºÅ©·Ñ ¹Ù([G]¿ë)

IDC_SCROLLBAR_G

½ºÅ©·Ñ ¹Ù([B]¿ë)

IDC_SCROLLBAR_B

½ºÅÂÆ½([R]¶óº§¿ë)

IDC_STATIC(µðÆúÆ®ÀΠä )

½ºÅÂÆ½([G]¶óº§¿ë)

IDC_STATIC(µðÆúÆ®ÀΠä )

½ºÅÂÆ½([B]¶óº§¿ë)

IDC_STATIC(µðÆúÆ®ÀΠä )

½ºÅÂÆ½(»ö Ç¥½Ã¿ë)

IDC_STATIC_VIEW


¡¡´ÙÀ½¿¡ stdafx.h ¾È¿¡¼­´Â CScrollBarŬ·¡½º¸¦ »ç¿ëÇϱâ À§Çؼ­ atlctrls.hÇì´õ¸¦ ÀÎŬ·çµå ÇÕ´Ï´Ù.

¡¡CMainDlgŬ·¡½º¿¡¼­´Â  ¿ì¼±  ½ºÅ©·Ñ ¹Ù ÄÁÆ®·Ñ¿ëÀ¸·Î CScrollBar Ŭ·¡½ºÀÇ ÀνºÅϽº¸¦ ¸â¹ö º¯¼ö·Î¼­ ¼±¾ðÇÕ´Ï´Ù. À̰ÍÀ» »ç¿ëÇϱâ À§Çؼ­´Â WM_INITDIALOG ¸Þ¼¼Áö Çڵ鷯·Î ÄÁÆ®·ÑÀÇ ÇÚµéÀ» ´ëÀÔÇÒ Çʿ䰡 ÀÖ½À´Ï´Ù. ±×¸®°í  »öÀ» Ç¥½ÃÇÏ´Â ±¸ÇüÀ» ³ªÅ¸³»´Â CRect Ŭ·¡½ºÀÇ ÀνºÅϽºµµ ¸â¹ö º¯¼ö·Î¼­ ¼±¾ðÇØ µÓ´Ï´Ù.

¡¡´ÙÀ½¿¡ WM_INITDIALOG ¸Þ¼¼Áö Çڵ鷯·Î ½ºÅ©·Ñ ¹Ù ÄÁÆ®·ÑÀÇ ¹üÀ§¿Í Ãʱâ À§Ä¡¸¦ ¼³Á¤ÇØ  »ö Ç¥½Ã¿ëÀÇ ½ºÅÂÆ½ ÄÁÆ®·Ñ ±¸ÇüÀ» ÃëµæÇÕ´Ï´Ù.

¡¡´ÙÀ½¿¡  ½ºÅ©·Ñ ¹ÙÀÇ WM_HSCROLL ¸Þ¼¼Áö Çڵ鷯¸¦ Ãß°¡ÇÕ´Ï´Ù. ÀÌ Çڵ鷯¿¡¼­´Â ½ºÅ©·Ñ ¹Ù ÄÁÆ®·ÑÀÇ À§Ä¡¸¦ ¼³Á¤ÇØ  »ö Ç¥½Ã¿ë ±¸ÇüÀ» °»½ÅÇÕ´Ï´Ù.

¡¡¸¶Áö¸·À¸·Î WM_PAINT ¸Þ¼¼Áö Çڵ鷯¸¦ Ãß°¡ÇØ  »öÀ» ¹¦È­ ÇÕ´Ï´Ù.