time 
设为首页】【收藏本站
当前位置: 主页 > 程序设计 > C\C++\VC > C语言 > 实例编程:弹出式菜单的按钮

实例编程:弹出式菜单的按钮

时间:2009-09-20 23:31 点击:631次 字体:[ ]




    一、新建一个以CButton类为基类的新类

    单击“Insert”→“New Class”,建立一个新类。基类设置为CButton,新类起名为CMenuButton.

    二、利用自绘方法绘制按钮,主体区显示按钮文本,选择区画一个小箭头

    在CMenuButton类中用ClassWizard添加函数:PreSubclassWindow()和DrawItem()。

    PreSubclassWindow()函数在建立按钮时执行,可用于做一些准备工作。在这里我给按钮添加自绘属性:

 void CMenuButton::PreSubclassWindow()
{
 ModifyStyle( 0, BS_OWNERDRAW ); //设置按钮属性为自绘式

 CButton::PreSubclassWindow();
}

    DrawItem()函数用于绘制按钮,左边绘制按钮文字,作为主体区,右边绘制一个小箭头,作为选择区。实际应用中,可根据具体需要绘制想要的形状和内容。

 void CMenuButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
 CDC *pDC = CDC::FromHandle( lpDrawItemStruct->hDC );
 m_ButRect = lpDrawItemStruct->rcItem; //获取按钮尺寸
 int nSavedDC = pDC->SaveDC();
 VERIFY( pDC );

 DrawButton(pDC); //绘制按钮

 pDC->RestoreDC( nSavedDC );
}

    其中m_ButRect都是CRect型对象,在头文件中进行定义。DrawButton()为绘制按钮的函数,把它定义在外边的目的是方便用户修改,如果你想改变按钮形状,只需修改DrawButton()函数即可。

 void CMenuButton::DrawButton(CDC *pDC)
{
 m_LRect.SetRect( m_ButRect.left, m_ButRect.top,
 m_ButRect.right-21, m_ButRect.bottom ); //按钮主体区尺寸
 m_RRect.SetRect( m_ButRect.right-20, m_ButRect.top,
 m_ButRect.right, m_ButRect.bottom ); //按钮选择区尺寸

 CPen Pen;
 Pen.CreatePen(PS_SOLID, 1, RGB(192,192,192) );
 pDC->SelectObject( &Pen );

 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()函数用于响应鼠标移动消息,当鼠标进入按钮时,设置相应标志,并重绘按钮边框,当鼠标离开按钮时,清除标志,恢复原边框。



本文地址 : http://www.fengfly.com/plus/view-77313-1.html
标签: 按钮 实例编程
------分隔线----------------------------
最新评论 查看所有评论
发表评论 查看所有评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
验证码:
本栏分类