< ¿À³Ê µå·Î¿ì >

¿À³Ê µå·Î¿ì¸¦
ÀÌ¿ëÇϸé ÄÁÆ®·ÑÀÇ ¿Ü°üÀ» µ¶ÀÚÀûÀÎ °ÍÀ¸·Î ÇÒ ¼ö°¡ ÀÖ½À´Ï´Ù.  WTLÀº ¿À³Ê µå·Î¿ì¸¦ ¼­Æ÷Æ® Çϱâ À§Çؼ­ COwnerDrawŬ·¡½º¸¦ ÁغñÇØ ÀÖ½À´Ï´Ù.

¡¡
´ÙÀ½¿¡ ³ªÅ¸³»´Â °ÍÀº COwnerDraw Ŭ·¡½º¸¦ »ç¿ëÇØ  ÆÄ¶û°ú »¡°­ÀÇ Çª½¬ ¹öưÀ» ÀÛ¼ºÇÏ´Â ¿¹ÀÔ´Ï´Ù.

 

// stdafx.h

#include <atlbase.h>

#include <atlapp.h>

extern CAppModule _Module;

#include <atlwin.h>

 

#include <atlcrack.h>

#include <atlmisc.h>

#include <atlframe.h>  // COwnerDrawŬ·¡½º¸¦ »ç¿ëÇϱâ À§ÇØ

                      

 

// maindlg.h

class CMainDlg : public CDialogImpl<CMainDlg>, public COwnerDraw<CMainDlg>

{

public:

    enum { IDD = IDD_MAINDLG };

 

    // ¸Þ¼¼Áö ¸Ê

    BEGIN_MSG_MAP_EX(CMainDlg)

        MSG_WM_INITDIALOG(OnInitDialog)

        COMMAND_ID_HANDLER_EX(IDOK, OnOK)

        COMMAND_ID_HANDLER_EX(IDCANCEL, OnCancel)

        CHAIN_MSG_MAP(COwnerDraw<CMainDlg>)    // COwnerDrawŬ·¡½º¿¡ üÀÎ

    END_MSG_MAP()

 

    void DrawItem(LPDRAWITEMSTRUCT lpdis){

        if(lpdis->CtlType == ODT_BUTTON){

            switch(lpdis->CtlID){

            case IDC_BUTTON_BLUE:

                DrawButton(lpdis, RGB(255, 255, 255), RGB(0, 0, 255));

                break;

            case IDC_BUTTON_RED:

                DrawButton(lpdis, RGB(255, 255, 255), RGB(255, 0, 0));

                break;

            default:

                break;

            }

        }

    }

 

    void DrawButton(LPDRAWITEMSTRUCT lpdis, COLORREF clrText, COLORREF clrBg){

        CDCHandle dc = lpdis->hDC;

        dc.SaveDC();

 

        // ĸ¼Ç Ç¥½Ã ¿µ¿ªÀ» ÃʱâÈ­

        CRect rcCaptionArea = lpdis->rcItem;

        rcCaptionArea.DeflateRect(2, 2);

 

        // ¹è°æ»ö ¹¦È­

        CBrush brushBg;

        brushBg.CreateSolidBrush(clrBg);

        dc.FillRect(&lpdis->rcItem, brushBg);

 

        // 3D¿¬ ¹¦È­

        if(lpdis->itemState & ODS_SELECTED){

            rcCaptionArea.OffsetRect(1, 1);

            dc.DrawEdge(&lpdis->rcItem, EDGE_SUNKEN, BF_RECT);

        }else{

            dc.DrawEdge(&lpdis->rcItem, EDGE_RAISED, BF_RECT);

        }

 

        // Æ÷Ä¿½º ±¸Çü ¹¦È­

        if(lpdis->itemState & ODS_FOCUS){

            CRect rcFocus = lpdis->rcItem;

            rcFocus.DeflateRect(4, 4);

            dc.DrawFocusRect(rcFocus);

        }

 

        // ĸ¼Ç ¹¦È­

        dc.SetTextColor(clrText);

        dc.SetBkMode(TRANSPARENT);

        dc.DrawText(_T("¿À³ªµå·Îº¸Åº"), -1,

            rcCaptionArea, DT_SINGLELINE | DT_CENTER | DT_VCENTER);

 

        dc.RestoreDC(-1);

    }

 

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

 

        return TRUE;

    }

 

    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;

}

                      


¡¡
¿ì¼±  ¸®¼Ò½º¸¦ ÀÛ¼ºÇÕ´Ï´Ù. ´ÙÀ̾ó·Î±×¿¡ ¹öư ÄÁÆ®·ÑÀ» 2°³ ¹èÄ¡ÇØ  ¸®¼Ò½º ID¸¦ ´ÙÀ½°ú °°ÀÌ ÁöÁ¤ÇÕ´Ï´Ù. µ¡ºÙ¿© ¾çÂÊ ¸ðµÎÀÇ ¹öư ÄÁÆ®·ÑÀÇ [½ºÅ¸ÀÏ]¿¡¼­´Â µðÆúÆ®¿¡ [¿À³Ê ¹¦È­]¿¡ üũ¸¦ ³Ö½À´Ï´Ù.

ÄÁÆ®·Ñ¸í

¸®¼Ò½º ID

Ǫ½¬ ¹öư

IDC_BUTTON_BLUE

Ǫ½¬ ¹öư

IDC_BUTTON_RED


¡¡
´ÙÀ½¿¡ COwnerDraw Ŭ·¡½º¸¦ »ç¿ëÇϱâ À§Çؼ­ stdafx.h¾È¿¡¼­ atlframe.hÇì´õ¸¦ Æ÷ÇÔ ÇÕ´Ï´Ù.

¡¡
´ÙÀ½¿¡ CMainDlg Ŭ·¡½ºÀÇ base class¿¡ COwnerDrawŬ·¡½º¸¦ Ãß°¡ÇØ  ¸Þ¼¼Áö ¸Ê¿¡ COwnerDrawŬ·¡½º¿¡ üÀÎÀ» Ãß°¡ÇÕ´Ï´Ù.  COwnerDrawŬ·¡½º´Â ³»ºÎ¿¡ ´ÙÀ½°ú °°Àº ¸Þ¼¼Áö ¸ÊÀ» ÁغñÇØ ÀÖ½À´Ï´Ù.

// COwnerDrawŬ·¡½º

BEGIN_MSG_MAP(COwnerDraw< T >)

    MESSAGE_HANDLER(WM_DRAWITEM, OnDrawItem)

    MESSAGE_HANDLER(WM_MEASUREITEM, OnMeasureItem)

    MESSAGE_HANDLER(WM_COMPAREITEM, OnCompareItem)

    MESSAGE_HANDLER(WM_DELETEITEM, OnDeleteItem)

ALT_MSG_MAP(1)  // ¸Þ¼¼Áö ¸®Ç÷º¼Ç¿ë ´ëü ¸Þ¼¼Áö ¸Ê

    MESSAGE_HANDLER(OCM_DRAWITEM, OnDrawItem)

    MESSAGE_HANDLER(OCM_MEASUREITEM, OnMeasureItem)

    MESSAGE_HANDLER(OCM_COMPAREITEM, OnCompareItem)

    MESSAGE_HANDLER(OCM_DELETEITEM, OnDeleteItem)

END_MSG_MAP()

                      


4
°³ÀÇ ¸Þ¼¼Áö Çڵ鷯´Â °¢°¢ ´ÙÀ½°ú °°Àº ¸â¹ö ÇÔ¼ö¸¦ È£ÃâÇÕ´Ï´Ù.

¸Þ¼¼Áö Çڵ鷯¸í

¸â¹ö ÇÔ¼ö¸í

OnDrawItem

DrawItem

OnMeasureItem

MeasureItem

OnCompareItem

CompareItem

OnDeleteItem

DeleteItem


COwnerDraw Ŭ·¡½º¿¡ÀÇ Ã¼Àο¡ ÀÇÇØ ¿À³Ê µå·Î¿ì°¡ ÇÊ¿äÇÑ Å¸Àֿ̹¡ ¸Þ½ÃÁö°¡ COwnerDraw Ŭ·¡½º¿¡ º¸³»Á® ÀÌ·¯ÇÑ ¸â¹ö ÇÔ¼ö°¡ ½ÇÇàµË´Ï´Ù. COwnerDrawŬ·¡½ºÀÇ »ó¼Ó Ŭ·¡½º(À§ÀÇ ¿¹¿¡¼­´ÂCMainDlgŬ·¡½º) ¿¡¼­´Â  ÀÌ·¯ÇÑ ¸â¹ö ÇÔ¼ö¸¦ ¿À¹ö¶óÀ̵å(override) ÇÏ´Â °Í¿¡ ÀÇÇØ ÄÁÆ®·Ñ¿¡ µ¶ÀÚÀûÀÎ ¿Ü°üÀ» ÁÝ´Ï´Ù.

CMainDlgŬ·¡½º¿¡¼­´Â DrawItem()À» ¿À¹ö ¶óÀ̵å(override) ÇØ ÄÁÆ®·ÑÀÇ IDº°·Î µ¶ÀÚÀûÀΠǪ½¬ ¹öưÀ» ¹¦È­ Çϰí ÀÖ½À´Ï´Ù.

¡¡
±×·±µ¥ COwnerDraw Ŭ·¡½º ³»ºÎÀÇ ¸Þ¼¼Áö ¸Ê¿¡´Â  ¸Þ¼¼Áö ¸®Ç÷º¼Ç¿ëÀÇ ´ëü ¸Þ¼¼Áö ¸ÊÀÌ ÁغñµÇ¾î ÀÖ½À´Ï´Ù. ´ÙÀ½¿¡ ³ªÅ¸³»´Â °ÍÀº ¸Þ¼¼Áö ¸®Ç÷º¼ÇÀ» »ç¿ëÇÑ ¿À³Ê µå·Î¿ìÀÇ ¹æ¹ýÀÔ´Ï´Ù.



¸Þ¼¼Áö ¸®Ç÷º¼Ç¿¡ ÀÇÇÑ ¿À³Ê µå·Î¿ì

¡¡¸Þ¼¼Áö ¸®Ç÷º¼ÇÀ» ÀÌ¿ëÇÏ´Â °Í¿¡ ÀÇÇØ ÄÁÆ®·Ñ Àڽſ¡°Ô ¿À³Ê µå·Î¿ì ½Ãų ¼ö°¡ Àֱ⠶§¹®¿¡  Àç»ç¿ë °¡´ÉÇÑ ÄÁÆ®·Ñ Ŭ·¡½º¸¦ ±â¼úÇϱ⠽¬¿öÁý´Ï´Ù. ´ÙÀ½¿¡ ³ªÅ¸³»´Â °ÍÀº COwnerDraw Ŭ·¡½º¿Í ¸Þ¼¼Áö ¸®Ç÷º¼ÇÀ» ÀÌ¿ëÇØ »ö º¯°æÀÌ °¡´ÉÇÑ ¹öư ÄÁÆ®·Ñ Ŭ·¡½ºCColorButtonÀÇ Á¤ÀÇÇÏ´Â ¿¹ ÀÔ´Ï´Ù. ÀÌ ¿¹¿¡¼­´Â ColorButton.hÀ̶ó°í ÇÏ´Â Çì´õ ÆÄÀÏÀ» ÁغñÇØ  °Å±â¿¡ CColorButton Ŭ·¡½º¸¦ Á¤ÀÇÇϰí ÀÖ½À´Ï´Ù.

// ColorButton.h

class CColorButton : public CWindowImpl<CColorButton>, public COwnerDraw<CColorButton>

{

public:

    DECLARE_WND_SUPERCLASS(_T("ColorButton"), _T("BUTTON"))

 

    // ¸Þ¼¼Áö ¸Ê

    BEGIN_MSG_MAP_EX(CColorButton)

        CHAIN_MSG_MAP_ALT(COwnerDraw<CColorButton>, 1)

        DEFAULT_REFLECTION_HANDLER()

    END_MSG_MAP()

 

    COLORREF m_clrText;

    COLORREF m_clrBg;

 

    CColorButton() : m_clrText(RGB(0, 0, 0)), m_clrBg(RGB(255, 255, 255))

    {}

 

    void DrawItem(LPDRAWITEMSTRUCT lpdis){

        CDCHandle dc = lpdis->hDC;

        dc.SaveDC();

 

        // ĸ¼Ç Ç¥½Ã ¿µ¿ªÀ» ÃʱâÈ­

        CRect rcCaptionArea = lpdis->rcItem;

        rcCaptionArea.DeflateRect(2, 2);

 

        // ¹è°æ»ö ¹¦È­

        CBrush brushBg;

        brushBg.CreateSolidBrush(m_clrBg);

        dc.FillRect(&lpdis->rcItem, brushBg);

 

        // 3D¿¬ ¹¦È­

        if(lpdis->itemState & ODS_SELECTED){

            rcCaptionArea.OffsetRect(1, 1);

            dc.DrawEdge(&lpdis->rcItem, EDGE_SUNKEN, BF_RECT);

        }else{

            dc.DrawEdge(&lpdis->rcItem, EDGE_RAISED, BF_RECT);

        }

 

        // Æ÷Ä¿½º ±¸Çü ¹¦È­

        if(lpdis->itemState & ODS_FOCUS){

            CRect rcFocus = lpdis->rcItem;

            rcFocus.DeflateRect(4, 4);

            dc.DrawFocusRect(rcFocus);

        }

 

        // ĸ¼Ç ¹¦È­

        dc.SetTextColor(m_clrText);

        dc.SetBkMode(TRANSPARENT);

        dc.DrawText(_T("¿À³ªµå·Îº¸Åº"), -1,

            rcCaptionArea, DT_SINGLELINE | DT_CENTER | DT_VCENTER);

 

        dc.RestoreDC(-1);

    }

 

    void SetColor(COLORREF clrText, COLORREF clrBg){

        m_clrText = clrText;

        m_clrBg = clrBg;

    }

}

                      


ÀÌ CColorButtonŬ·¡½º´Â CWindowImpl Ŭ·¡½º¿Í COwnerDrawŬ·¡½º·ÎºÎÅÍ ÆÄ»ýÇϰí ÀÖ½À´Ï´Ù. CColorButton Ŭ·¡½º´Â ¹Ý¼ÛµÈ ¿À³Ê µå·Î¿ì¿ë ¸Þ¼¼Áö¸¦ üÀο¡ ÀÇÇØCOwnerDrawŬ·¡½ºÀÇ ´ëü ¸Þ¼¼Áö ¸Ê¿¡ º¸³À´Ï´Ù.  ´ëü ¸Þ¼¼Áö ¸Ê¿¡´Â ÀüÁ¦¿Í °°ÀÌ 4°³ÀÇ ¸Þ¼¼Áö Çڵ鷯°¡ ÁغñµÇ¾î ÀÖ¾î CColorButton Ŭ·¡½º´Â ±× ÁßÀÇ OnDrawItem() ÀÌ È£ÃâÇÏ´Â DrawItem()À» ¿À¹ö¶óÀ̵å(override) ÇØ ¹öưÀ» ¹¦È­ Çϰí ÀÖ½À´Ï´Ù.

¡¡
´ÙÀ½¿¡ ÀÌ CColorButton Ŭ·¡½º¸¦ »ç¿ëÇØ ¾ÕÀÇ ¿À³Ê µå·Î¿ì ¹öưÀÇ ÇÁ·Î±×·¥À» º¯°æÇÏ´Â ¿¹¸¦ ³ªÅ¸³À´Ï´Ù.

// stdafx.h

#include <atlbase.h>

#include <atlapp.h>

extern CAppModule _Module;

#include <atlwin.h>

 

#include <atlcrack.h>

#include <atlmisc.h>

#include <atlframe.h>  // COwnerDrawŬ·¡½º¸¦ »ç¿ëÇϱâ À§ÇØ

                      

 

// maindlg.h

class CMainDlg : public CDialogImpl<CMainDlg>

{

public:

    enum { IDD = IDD_MAINDLG };

 

    CColorButton m_button_blue;

    CColorButton m_button_red;

 

    // ¸Þ¼¼Áö ¸Ê

    BEGIN_MSG_MAP_EX(CMainDlg)

        MSG_WM_INITDIALOG(OnInitDialog)

        COMMAND_ID_HANDLER_EX(IDOK, OnOK)

        COMMAND_ID_HANDLER_EX(IDCANCEL, OnCancel)

        REFLECT_NOTIFICATIONS()

    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_button_blue.SubclassWindow(GetDlgItem(IDC_BUTTON_BLUE));

        m_button_blue.SetColor(RGB(255, 255, 255), RGB(0, 0, 255));

 

        m_button_red.SubclassWindow(GetDlgItem(IDC_BUTTON_RED));

        m_button_red.SetColor(RGB(255, 255, 255), RGB(255, 0, 0));

 

        return TRUE;

    }

 

    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 "ColorButton.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;

}

                      


¡¡
¿ì¼± CMainDlg Ŭ·¡½º¿¡ CColorButton Ŭ·¡½ºÀÇ ÀνºÅϽº¸¦ ¸â¹ö º¯¼ö·Î¼­ 2°³ ¼±¾ðÇÕ´Ï´Ù. À̰͵éÀº OnInitDialog()À¸·Î ¼­ºê Ŭ·¡½ºÈ­ ÇÕ´Ï´Ù. ¼­ºê Ŭ·¡½ºÈ­ÇÑ ÈÄ ¿¡SetColor()¿¡ ÀÇÇØ °¢°¢ ¹öưÀÇ ¹®ÀÚ»ö°ú ¹è°æ»öÀ» ¼³Á¤ÇÕ´Ï´Ù. ±×¸®°í  ¸Þ¼¼Áö ¸Ê¿¡´Â ¸Þ¼¼Áö ¸®Ç÷º¼ÇÀ» À§Çؼ­ REFLECT_NOTIFICATIONS ¸ÅÅ©·Î¸¦ Ãß°¡ÇÕ´Ï´Ù.

¡¡
¸¶Áö¸·À¸·Î Control.cpp ÆÄÀÏ ³»¿¡¼­ ColorButton.h Çì´õ¸¦ Æ÷ÇÔ ÇÕ´Ï´Ù.