龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > VC开发 >

用VC制作带弹出式菜单的按钮(3)

时间:2009-12-30 15:42来源:未知 作者:admin 点击:
分享到:
void CMenuButton::OnMouseMove(UINT nFlags, CPoint point) { if( !b_InFlag || GetCapture()!=this ) //鼠标进入按钮 { b_InFlag = true; //设置进入标志 SetCapture(); //捕获鼠标 m_State = 1;

void CMenuButton::OnMouseMove(UINT nFlags, CPoint point)
{
 if( !b_InFlag || GetCapture()!=this ) //鼠标进入按钮
 {
  b_InFlag = true; //设置进入标志
  SetCapture(); //捕获鼠标
  m_State = 1; //置按钮状态(1-当前按钮)
  if( b_ClickFlag ) //检测单击选择区标志
  {
   m_Menu.Detach(); //清除打开的菜单
   m_Menu.DestroyMenu();
   b_ClickFlag = false;
  }
  Invalidate(); //重绘按钮
 }
 else
 {
  if ( !m_ButRect.PtInRect(point) ) //鼠标离开按钮
  {
   b_InFlag = false; //清除进入标志
   ReleaseCapture(); //释放鼠标捕获
   b_ClickBut = false; //清除单击标志
   m_State = 0; //置按钮状态(0-正常按钮)
   if( b_ClickFlag ) //检测单击选择区标志
   {
    m_Menu.Detach(); //清除打开的菜单
    m_Menu.DestroyMenu();
    b_ClickFlag = false;
   }
   Invalidate(); //重绘按钮
  }
 }

 CButton::OnMouseMove(nFlags, point);

  b_InFlag是个BOOL型量,鼠标进入时设置,离开时清除,目的是防止鼠标在按钮上移动时重复刷新按钮,以避免闪烁。

  b_ClickFlag是单击按钮选择区标志,当它为true时,表示弹出菜单已打开,为false时表示菜单未弹出。当菜单已经弹出,而鼠标又移回按钮单击时,应清除菜单。

  b_ClickBut是单击按钮主体区标志。

  OnLButtonDown()函数响应按钮单击消息,当单击的是按钮主体区时,设置b_ClickBut标志;当单击的是按钮选择区时,要根据单击次数,决定是否弹出菜单。

void CMenuButton::OnLButtonDown(UINT nFlags, CPoint point)
{
 if( m_LRect.PtInRect(point) ) //单击按钮主体区
 {
  m_State = 2; //置按钮状态(2-正常按钮)
  b_ClickBut = true; //设置单击按钮标志
  Invalidate(); //重绘按钮
 }
 else if( m_RRect.PtInRect(point) && m_MenuID ) //单击选择区
 {
  m_State = 3;
  b_ClickBut = false; //清除单击按钮标志
  Invalidate(); //重绘按钮
  b_ClickFlag = !b_ClickFlag; //单击选择区标志
  if( b_ClickFlag ) //一次单击,弹出菜单
  {
   CRect rect = m_RRect;
   ClientToScreen(rect); //转换为屏幕坐标
   point = rect.BottomRight();
   point.x -= rect.Width(); //设置弹出菜单的位置

精彩图集

赞助商链接