`
isiqi
  • 浏览: 15948138 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

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

QQ 
阅读更多

蓝色边框,选择时是深蓝色边框,下拉按钮可以自定义图片,不过只能是 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_msg
voidOnMouseMove(UINTnFlags,CPointpoint);
afx_msg
voidOnTimer(UINTnIDEvent);
afx_msg
voidOnLButtonDown(UINTnFlags,CPointpoint);
afx_msg
voidOnLButtonUp(UINTnFlags,CPointpoint);
//}}AFX_MSG

DECLARE_MESSAGE_MAP()
private:
voidDrawButton(CDC*pDC);
private:

unsigned
intm_normal_id;
unsigned
intm_hover_id;
unsigned
intm_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(unsigned
intnormal_id,
unsigned
inthover_id,
unsigned
intpush_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);
}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics