< Æ®·¢ ¹Ù >

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

// atlctrls.h

typedef CTrackBarCtrlT<ATL::CWindow>   CTrackBarCtrl;

                      


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

¡¡WTL
ÀÇ CTrackBarCtrlŬ·¡½º´Â MFCÀÇ CSliderCtrlŬ·¡½º¿Í °ÅÀÇ °°Àº ¸â¹ö ÇÔ¼ö¸¦ ÁغñÇØ ÀÖ½À´Ï´Ù. ÀÌÇÏ¿¡ ³ªÅ¸³»´Â °ÍÀº CTrackBarCtrl Ŭ·¡½º¸¦ »ç¿ëÇÏ´Â ¿¹ ÀÔ´Ï´Ù. Æ®·° ¹Ù¸¦ ¿ÞÂÊÀ¸·Î À̵¿ÇÏ´Â ¸¸Å­ ´ÙÀ̾ó·Î±×ÀÇ Åõ¸íµµ¸¦ ³ô°Ô ÇØ Ç¥½ÃÇÕ´Ï´Ù. µ¡ºÙ¿© ÀÌ ÇÁ·Î±×·¥Àº ¹ÝÅõ¸í ±â´É(SetLayeredWindowAttributes()) À» »ç¿ëÇϱ⠶§¹®¿¡  Windows 2000ÀÌÈÄ ¹öÀü¿¡ ½ÇÇàÇÒ Çʿ䰡 ÀÖ½À´Ï´Ù.

 

// stdafx.h

#define _WIN32_WINNT  0x0500

 

#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 };

 

    CTrackBarCtrl m_track_layer;  // Æ®·¢ ¹Ù

 

    // ¸Þ¼¼Áö ¸Ê

    BEGIN_MSG_MAP_EX(CMainDlg)

        MSG_WM_INITDIALOG(OnInitDialog)

        MSG_WM_HSCROLL(OnHScroll)

        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);

 

        // È®Àå À©µµ¿ì ½ºÅ¸ÀÏ ¼³Á¤

        ModifyStyleEx(0, WS_EX_LAYERED);

 

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

        m_track_layer = GetDlgItem(IDC_SLIDER_LAYER);

 

        m_track_layer.SetRange(0, 255);

        m_track_layer.SetTicFreq(15);

        m_track_layer.SetPageSize(15);

        m_track_layer.SetLineSize(1);

 

        m_track_layer.SetPos(255);

        SetLayer(m_track_layer.GetPos());

 

        return TRUE;

    }

 

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

        CTrackBarCtrl trackbar = hWnd;

        SetLayer(trackbar.GetPos());

    }

 

    void SetLayer(BYTE byteAlpha){

        HMODULE hDll = LoadLibrary(_T("user32"));

        if(hDll){

            typedef BOOL (WINAPI *PSLWA) (HWND, COLORREF, BYTE, DWORD);

            PSLWA pSetLayeredWindowAttributes

                = (PSLWA)GetProcAddress(hDll, "SetLayeredWindowAttributes");

 

            if(pSetLayeredWindowAttributes != NULL)

                pSetLayeredWindowAttributes(m_hWnd, 0, byteAlpha, LWA_ALPHA);

 

            FreeLibrary(hDll);

        }

    }

 

    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)

{

    // WindowsÀÇ ¹öÁ¯ üũ

    OSVERSIONINFO vi = {sizeof(OSVERSIONINFO)};

    GetVersionEx(&vi);

    if(vi.dwPlatformId != VER_PLATFORM_WIN32_NT || vi.dwMajorVersion < 5){

        AtlMessageBox(NULL, _T("OS°¡ ¹ÝÅõ¸í ±â´É¿¡ ´ëÀÀÇϰí ÀÖÁö ¾Ê½À´Ï´Ù. "),

            _T("¿¡·¯"), MB_OK | MB_ICONERROR);

        return 0;

    }

 

    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

Æ®·° ¹Ù

IDC_SLIDER_LAYER


¡¡
´ÙÀ½¿¡ stdafx.h¿¡¼­´Â CTrackBarCtrlŬ·¡½º¸¦ »ç¿ëÇϱâ À§Çؼ­ atlctrls.hÇì´õ¸¦ ÀÎŬ·çµå ÇÕ´Ï´Ù. ±×¸®°í  À̹ø ¿¹¿¡¼­´ÂSetLayeredWindowAttributes()APIÀ» »ç¿ëÇϹǷΠ _WIN32_WINNT ¸¦ 0x0500 ¿¡ Á¤ÀÇÇÕ´Ï´Ù.

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

¡¡
´ÙÀ½¿¡ WM_INITDIALOG ¸Þ¼¼Áö Çڵ鷯·Î È®Àå À©µµ¿ì ½ºÅ¸ÀÏ¿¡ WS_EX_LAYERED¸¦ Ãß°¡ÇØ  ±× ÈÄ Æ®·¢ ¹Ù ÄÁÆ®·ÑÀÇ Ãʱ⼳Á¤À» ÇÕ´Ï´Ù. ¿©±â¿¡¼­´Â  ¹üÀ§(ÃÖ¼ÒÄ¡ 0, ÃÖ´ëÄ¡255) , ´«±Ý ¸¶Å©ÀÇ Àß°Ô ½ä±â(15¸¶´Ù ´«±Ý ¸¶Å©¸¦ Ç¥½Ã)  ÆäÀÌÁö »çÀÌÁî([PageUp][PageDown]۸¦ ´­·¶À» ¶§¿¡15µÎ°³ À̵¿)  ¶óÀÎ »çÀÌÁî(Ä¿¼­ ۸¦ ´­·¶À» ¶§¿¡ 1 µÎ°³ À̵¿) ¸¦ ¼³Á¤ÇØ ÀÖ½À´Ï´Ù. °Ô´Ù°¡ ¾ÈÁÖÀÇ Ãʱâ À§Ä¡¸¦255·Î ÇÏ¿© ±× À§Ä¡¸¦SetLayer()¿¡ °Ç³×ÁÖ°í ÀÖ½À´Ï´Ù. À̰ÍÀº µðÆúÆ®·Î ºÒÅõ¸íÇÑ ´ÙÀ̾ó·Î±×¸¦ Ç¥½ÃÇÏ´Â °ÍÀ» ÀǹÌÇÕ´Ï´Ù.

¡¡
´ÙÀ½¿¡ WM_HSCROLL¸Þ¼¼Áö Çڵ鷯¸¦ Ãß°¡ÇÕ´Ï´Ù. Æ®·¢ ¹Ù ÄÁÆ®·ÑÀº ½ºÅ©·Ñ ¹Ù¿Í °°ÀÌ  ¹Ù¸¦ À̵¿Çϸé WM_HSCROLL¸Þ¼¼Áö¸¦ ºÎ¸ð À©µµ¿ì¿¡ º¸³À´Ï´Ù.  WM_HSCROLL¸Þ¼¼Áö Çڵ鷯¿¡¼­´Â  Æ®·¢ ¹Ù ÄÁÆ®·ÑÀÇ ÇöÀç À§Ä¡¸¦ ÃëµæÇØ  SetLayer()ÇÔ¼ö¿¡ °Ç³×ÁÖ°í ÀÖ½À´Ï´Ù.

SetLayer()ÇÔ¼ö¿¡¼­´Â ,user32.dllÀ¸·ÎºÎÅÍ SetLayeredWindowAttributes()APIÀÇ ÁÖ¼Ò¸¦ ÃëµæÇØ , ´ÙÀ̾ó·Î±×¸¦ Åõ¸íµµ¸¦ º¯°æÇϰí ÀÖ½À´Ï´Ù.

¡¡
¸¶Áö¸·À¸·Î ,_tWinMain()¾È¿¡¼­GetVersionEx()¸¦ È£ÃâÇÏ´Â °Í¿¡ ÀÇÇØWindowsÀÇ ¹öÁ¯ üũ¸¦ ÇÕ´Ï´Ù.