蓝色边框,选择时是深蓝色边框,下拉按钮可以自定义图片,不过只能是 15*16的BMP
classCMyComboBox:publicCComboBox
...{
//Construction
public:
CMyComboBox();
//normal_id普通状态图片的ID
//hover_idhover状态图片的ID
//push_idpush状态图片的ID
CMyComboBox(unsignedintnormal_id,unsignedinthover_id,unsignedintpush_id);
//Attributes
public:
//Operations
public:
//OverridesClassWizard
//generatedvirtualfunctionoverrides
//{{AFX_VIRTUAL(CMyComboBox)
protected:
virtualvoidPreSubclassWindow();
//}}AFX_VIRTUAL
//Implementation
public:
virtual~CMyComboBox();
//Generatedmessagemapfunctions
protected:
//{{AFX_MSG(CMyComboBox)
afx_msgvoidOnPaint();
afx_msgvoidOnMouseMove(UINTnFlags,CPointpoint);
afx_msgvoidOnTimer(UINTnIDEvent);
afx_msgvoidOnLButtonDown(UINTnFlags,CPointpoint);
afx_msgvoidOnLButtonUp(UINTnFlags,CPointpoint);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
private:
voidDrawButton(CDC*pDC);
private:
unsignedintm_normal_id;
unsignedintm_hover_id;
unsignedintm_push_id;
//0-normal1-hover2-push
intm_button_state;
boolm_active;
boolm_draw;
};



#defineBUTTON_STATE_NORMAL0
#defineBUTTON_STATE_HOVER(1<<1)
#defineBUTTON_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(unsignedintnormal_id,
unsignedinthover_id,
unsignedintpush_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()

/**//////////////////////////////////////////////////////////////////////////////
//CMyComboBoxmessagehandlers



voidCMyComboBox::PreSubclassWindow()
...{
CRectrc;
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()
...{
CRectrc;
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);
}
voidCMyComboBox::OnMouseMove(UINTnFlags,CPointpoint)
...{
m_draw=true;
SetTimer(1,10,NULL);
OnTimer(1);
CComboBox::OnMouseMove(nFlags,point);
}
void
CMyComboBox::OnTimer(UINTnIDEvent)
...{
POINTpt;
CRectrc,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;
CDCMemDC;
CBitmapbitmap;
CRectrc;
GetWindowRect(&rc);
MemDC.CreateCompatibleDC(pDC);
if(m_button_state==BUTTON_STATE_NORMAL)
...{
bitmap.LoadBitmap(m_normal_id);
}
elseif(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);
}


voidCMyComboBox::OnLButtonDown(UINTnFlags,CPointpoint)
...{
m_button_state=BUTTON_STATE_PUSH;
Invalidate();
CComboBox::OnLButtonDown(nFlags,point);
}
voidCMyComboBox::OnLButtonUp(UINTnFlags,CPointpoint)
...{
m_button_state=BUTTON_STATE_HOVER;
Invalidate();
CComboBox::OnLButtonUp(nFlags,point);
}
5655

被折叠的 条评论
为什么被折叠?



