被迫写一个类似qq登陆框上面的那个下拉框控件

蓝色边框,选择时是深蓝色边框,下拉按钮可以自定义图片,不过只能是 15*16的BMP

class CMyComboBox : public CComboBox
{
// Construction
public:
    CMyComboBox();
    
// normal_id 普通状态图片的ID
    
// hover_id  hover状态图片的ID
    
// push_id   push状态图片的ID
    CMyComboBox(unsigned int normal_id,unsigned int hover_id,unsigned int push_id);

// Attributes
public:

// Operations
public:

// OverridesClassWizard
    
//  generated virtual function overrides
    
//{{AFX_VIRTUAL(CMyComboBox)
    protected:
    
virtual void PreSubclassWindow();
    
//}}AFX_VIRTUAL

// Implementation
public:
    
virtual ~CMyComboBox();

    
// Generated message map functions
protected:
    
//{{AFX_MSG(CMyComboBox)
    afx_msg void OnPaint();
    afx_msg 
void OnMouseMove(UINT nFlags, CPoint point);
    afx_msg 
void OnTimer(UINT nIDEvent);
    afx_msg 
void OnLButtonDown(UINT nFlags, CPoint point);
    afx_msg 
void OnLButtonUp(UINT nFlags, CPoint point);
    
//}}AFX_MSG

    DECLARE_MESSAGE_MAP()
private:
    
void DrawButton(CDC* pDC);
private:

    unsigned 
int m_normal_id;
    unsigned 
int m_hover_id;
    unsigned 
int m_push_id;

    
//0-normal 1-hover 2-push
    int  m_button_state;

    
bool m_active;
    
bool m_draw;
}
;




#define BUTTON_STATE_NORMAL 0
#define BUTTON_STATE_HOVER    (1<<1)
#define BUTTON_STATE_PUSH    (1<<2)

/////////////////////////////////////////////////////////////////////////////
// CMyComboBox

CMyComboBox::CMyComboBox():m_active(
false),
                           m_normal_id(
0),
                           m_hover_id(
0),
                           m_push_id(
0),
                           m_button_state(BUTTON_STATE_NORMAL)
{

}


CMyComboBox::CMyComboBox(unsigned 
int normal_id,
                         unsigned 
int hover_id,
                         unsigned 
int push_id):
                            m_active(
false),
                            m_normal_id(normal_id),
                            m_hover_id(hover_id),
                            m_push_id(push_id),
                            m_button_state(BUTTON_STATE_NORMAL)
{

}


CMyComboBox::
~CMyComboBox()
{
}



BEGIN_MESSAGE_MAP(CMyComboBox, CComboBox)
    
//{{AFX_MSG_MAP(CMyComboBox)
    ON_WM_PAINT()
    ON_WM_MOUSEMOVE()
    ON_WM_TIMER()
    ON_WM_LBUTTONDOWN()
    ON_WM_LBUTTONUP()
    
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMyComboBox message handlers




void CMyComboBox::PreSubclassWindow() 
{
    CRect rc;
    GetWindowRect(
&rc);

    rc.left 
-= 2;
    rc.top 
-= 15;
    rc.bottom 
-= 23;
    rc.right 
-= 8;

    MoveWindow(
&rc);

    ModifyStyle(
0,BS_OWNERDRAW);
    CComboBox::PreSubclassWindow();
}




void
CMyComboBox::OnPaint()
{
    CRect    rc;
    CDC
*    pDC;

    Default();

    
    pDC 
= GetDC();

    GetClientRect(rc);

    
if(m_active)
        pDC
->Draw3dRect(rc, RGB(78,108,133), RGB(78,108,133));
    
else
        pDC
->Draw3dRect(rc, RGB(126,157,185), RGB(126,157,185));

    
//填充掉阴影
    rc.DeflateRect(1,1);
    pDC
->Draw3dRect(rc, RGB(255,255,255), RGB(255,255,255));
    
//填充掉原来的按钮
    rc.left += (rc.Width() - 18);
    rc.DeflateRect(
1,1);
    pDC
->Draw3dRect(rc, RGB(255,255,255), RGB(255,255,255));

    DrawButton(pDC);
    ReleaseDC(pDC);
}


void CMyComboBox::OnMouseMove(UINT nFlags, CPoint point) 
{
    m_draw 
= true;
    SetTimer(
1,10,NULL);
    OnTimer(
1);

    CComboBox::OnMouseMove(nFlags, point);
}


void 
CMyComboBox::OnTimer(UINT nIDEvent) 
{
    POINT pt;
    CRect rc,rc_button;

    GetCursorPos(
&pt);

    GetWindowRect(
&rc);
    
    rc_button 
= rc;
    rc_button.left 
+= rc_button.Width() - 17;
    
    
if(rc_button.PtInRect(pt))
    
{
        
if(m_button_state != BUTTON_STATE_PUSH)
            m_button_state 
= BUTTON_STATE_HOVER;
    }

    
else
        m_button_state 
= BUTTON_STATE_NORMAL;

    
if(rc.PtInRect(pt))
    
{
        m_active 
= true;
        
if(m_draw)
        
{
            m_draw 
= false;
            Invalidate();
        }

    }

    
else
    
{
        KillTimer (
1);
        m_active       
= false;
        m_button_state 
= 0;

        Invalidate();
    }


    CComboBox::OnTimer(nIDEvent);
}


void 
CMyComboBox::DrawButton(CDC
* pDC)
{
    
if(m_normal_id == 0 || m_hover_id ==0 || m_push_id == 0)
        
return;
    CDC            MemDC;
    CBitmap        bitmap;
    CRect        rc;

    GetWindowRect(
&rc);
    
    MemDC.CreateCompatibleDC(pDC);

    
if( m_button_state == BUTTON_STATE_NORMAL )
    
{
        bitmap.LoadBitmap(m_normal_id);
    }

    
else if( m_button_state == BUTTON_STATE_HOVER )
    
{
        bitmap.LoadBitmap(m_hover_id);
    }

    
else
    
{
        bitmap.LoadBitmap(m_push_id);
    }


    MemDC.SelectObject(
&bitmap);
    pDC
->BitBlt(rc.Width()-17,3,15,16,&MemDC,0,0,SRCCOPY);
}




void CMyComboBox::OnLButtonDown(UINT nFlags, CPoint point) 
{
    m_button_state 
= BUTTON_STATE_PUSH;
    Invalidate();
    CComboBox::OnLButtonDown(nFlags, point);
}


void CMyComboBox::OnLButtonUp(UINT nFlags, CPoint point) 
{
    m_button_state 
= BUTTON_STATE_HOVER;
    Invalidate();
    CComboBox::OnLButtonUp(nFlags, point);
}

 
原文地址:https://www.cnblogs.com/rainbowzc/p/2422189.html