본문 바로가기

Windows/MFC

CComboBox Ownerdraw combobox(skin)

[code]// ComboBoxExk.cpp : implementation file
//

// DATE        : June 27, 2006
// CODER    : aucd29 (aucd29@gmail.com)
//
//
// -----------------------------------------------------------------------
// NOTE : July 28, 2006
// -----------------------------------------------------------------
// * 찾다가 못 찾아서 결국 내가 직접 만들게 되는 ComboBox -_-;
//

#include "stdafx.h"
#include "SMS_WIZARD.h"
#include "ComboBoxExk.h"
#include "memdc.h"


// CComboBoxExk

IMPLEMENT_DYNAMIC(CComboBoxExk, CComboBox)

CComboBoxExk::CComboBoxExk()
: m_bFocus(false)
, m_bClick(false)
, m_szFont(_T("tahoma"))
, m_nFontSize(13)
, m_nNormalImage(0)
, m_nOverImage(0)
{
    m_crBorder = RGB(0, 0, 0);
}

CComboBoxExk::~CComboBoxExk()
{
}


BEGIN_MESSAGE_MAP(CComboBoxExk, CComboBox)
    ON_WM_PAINT()
    ON_WM_MOUSEMOVE()
    ON_WM_LBUTTONDOWN()
    ON_CONTROL_REFLECT(CBN_SELCHANGE, &CComboBoxExk::OnCbnSelchange)
    ON_CONTROL_REFLECT(CBN_SELENDCANCEL, &CComboBoxExk::OnCbnSelendcancel)
    ON_WM_ERASEBKGND()
END_MESSAGE_MAP()



// CComboBoxExk message handlers

void CComboBoxExk::OnPaint()
{
    CPaintDC dc(this); // device context for painting
    CRect rClient;    
    GetClientRect(rClient);
    CMemDC mDC(&dc, &rClient);
    CDC bitmapDC;
    bitmapDC.CreateCompatibleDC(&dc);
    
    CPen myPen, * pOldPen;
    myPen.CreatePen(PS_SOLID, 1, m_crBorder);
    pOldPen = mDC.SelectObject(&myPen);
    mDC.Rectangle(&rClient);

    CString szCurentText;
    GetLBText(GetCurSel(), szCurentText);

    if (szCurentText != L"")
    {
        CFont font;
        LOGFONT lf;
        memset(&lf, 0, sizeof(LOGFONT));
        lf.lfHeight = m_nFontSize;
        wsprintf(lf.lfFaceName, m_szFont);
        font.CreateFontIndirect(&lf);
        CFont* def_font = mDC.SelectObject(&font);
        mDC.SetBkMode(TRANSPARENT);

        // 선택한 데이터가 있으면 출력 해주자.
        mDC.TextOut(4, 4, szCurentText);

        mDC.SelectObject(def_font);
        font.DeleteObject();
    }

    BITMAP bm;
    CBitmap bmpButton;    
    CBitmap bmpButtonOver;

    // 이미지가 없으면 리턴.
    if (!m_nNormalImage || ! m_nOverImage)
    {
        return;
    }
    
    bmpButton.LoadBitmap(m_nNormalImage);
    bmpButtonOver.LoadBitmap(IDB_BTN_COMBO_OVER);
    bmpButton.GetObject(sizeof(BITMAP), &bm);

    if(!m_bFocus)
    {
        bitmapDC.SelectObject(&bmpButtonOver);
    }
    else
    {
        bitmapDC.SelectObject(&bmpButton);
    }

    mDC.BitBlt((rClient.Width() - bm.bmWidth)-1, 1, bm.bmWidth, bm.bmHeight, &bitmapDC, 0, 0, SRCCOPY);
    mDC.SelectObject(pOldPen);
}

void CComboBoxExk::SetBorderColor(COLORREF crBorder)
{
    m_crBorder = crBorder;
}

void CComboBoxExk::OnMouseMove(UINT nFlags, CPoint point)
{
    CRect rectClient;
    GetClientRect(rectClient);

    if (rectClient.PtInRect(point))
    {
        if (!m_bClick)
        {    
            if (!m_bFocus)
            {
                m_bFocus = true;
                SetCapture();
            }            
        }
    }
    else
    {
        if(!m_bClick)
        {
            m_bClick = false;
            m_bFocus = false;
            ReleaseCapture();
        }        
    }

    CComboBox::OnMouseMove(nFlags, point);
}

void CComboBoxExk::OnLButtonDown(UINT nFlags, CPoint point)
{
    // 클릭시 이미지변경을 위한 작업
    m_bClick = true;
    m_bFocus = false;
    ReleaseCapture();

    CComboBox::OnLButtonDown(nFlags, point);
}

void CComboBoxExk::OnCbnSelchange()
{
    // 아이템을 선택했을 때 클릭한 값을 반전
    m_bClick = false;
    Invalidate();
}

void CComboBoxExk::OnCbnSelendcancel()
{
    // 아이템을 클릭하지 않고 빠져 나갔을 때 클릭한 값을 반전
    m_bClick = false;
}

void CComboBoxExk::SetFont(LPCTSTR szFont, int nFont)
{
    m_szFont    = szFont;
    m_nFontSize = nFont;
}

BOOL CComboBoxExk::OnEraseBkgnd(CDC* pDC)
{
    return true;
    //return CComboBox::OnEraseBkgnd(pDC);
}

void CComboBoxExk::SetImage(unsigned int nNormalImage, unsigned int nOverImage)
{
    m_nNormalImage    = nNormalImage;
    m_nOverImage    = nOverImage;
}
[/code]

'Windows > MFC' 카테고리의 다른 글

HICON 아이콘 뿌리기 DrawIconEx  (0) 2013.10.02
Current icon image types (Icon type 종류별 선택)  (0) 2013.10.02
CHeaderCtrl Skin image  (0) 2013.10.02
CListCtrl Changing color of gridlines in a listctrl  (0) 2013.10.02
CustomDraw ListView  (0) 2013.10.02