用VC制作带弹出式菜单的按钮(2)
pDC->FillSolidRect( m_ButRect, m_BackColor ); //画背景
switch( m_State ) //不同状态画不同边框
{
case 0: //正常按钮
pDC->DrawEdge( &m_LRect, BDR_RAISEDINNER, BF_RECT );
pDC->DrawEdge( &m_RRect, BDR_RAISEDINNER, BF_RECT );
break;
case 1: //鼠标进入时的按钮
pDC->DrawEdge( &m_LRect, BDR_RAISEDINNER, BF_RECT );
pDC->DrawEdge( &m_RRect, BDR_RAISEDINNER, BF_RECT );
pDC->MoveTo( m_ButRect.TopLeft() );
pDC->LineTo( m_ButRect.right, m_ButRect.top );
break;
case 2: //单击按钮主体区时的按钮
pDC->DrawEdge( &m_RRect, BDR_RAISEDINNER, BF_RECT );
break;
case 3: //单击按钮选择区时的按钮
pDC->DrawEdge( &m_LRect, BDR_RAISEDINNER, BF_RECT );
break;
}
POINT m_pt[3], m_ptCentre; //箭头坐标(三个顶点)
m_ptCentre = m_RRect.CenterPoint(); //选择区中点位置
m_pt[0].x = m_ptCentre.x-3; //计算箭头坐标
m_pt[0].y = m_ptCentre.y-2;
m_pt[1].x = m_ptCentre.x+4;
m_pt[1].y = m_ptCentre.y-2;
m_pt[2].x = m_ptCentre.x;
m_pt[2].y = m_ptCentre.y+2;
pDC->SelectStockObject( BLACK_BRUSH ); //定义画刷(黑色)
CRgn rgn;
rgn.CreatePolygonRgn( m_pt, 3, ALTERNATE );
pDC->PaintRgn( &rgn ); //画选择区箭头
pDC->SetTextColor( m_ForeColor ); //画主体区文字
pDC->SetBkMode( TRANSPARENT );
pDC->DrawText( m_strText, &m_LRect, DT_SINGLELINE | DT_CENTER | DT_VCENTER | DT_END_ELLIPSIS);
}
m_State是个标志,其值为0表示正常按钮;1表示鼠标进入按钮,绘制暗线边框;2表示在按钮主体区按下鼠标左键;3表示在按钮选择区按下鼠标左键。
在m_State的不同取值下,绘制不同的按钮边框,可以增加按钮的动态效果。
三、添加鼠标响应函数
在CMenuButton类中用ClassWizard添加函数:OnMouseMove()、OnLButtonDown()、OnLButtonUp()。
OnMouseMove()函数用于响应鼠标移动消息,当鼠标进入按钮时,设置相应标志,并重绘按钮边框,当鼠标离开按钮时,清除标志,恢复原边框。
- 上一篇:VC++中查找/替换对话框的使用
- 下一篇:VC++中进程间相互通信的十一种方法