环境:VS2008 MFC
问题:我重绘了按钮,分为3个状态:正常、鼠标进入、鼠标按下;当点击鼠标时会在按钮下面弹出右键菜单。现在问题是右键菜单弹出后,按钮的按下状态就消失了!!请问如何在弹出菜单时使按钮保持按下状态,在菜单消失时按钮状态恢复正常?

解决方案 »

  1.   

    你试试看设立一个BOOL标志位,来判断按钮是否按下的状态
      

  2.   

    给楼主两个可以探索的函数OnKillFocus
    SetCapture
      

  3.   

    菜单是系统绘制的菜单啊,怎么用SetCapture?
      

  4.   


    我资源里有右键菜单的demo
      

  5.   

    看你自己的判断。按钮的状态用CButton::SetState(),用m_btn.SetState(TRUE)就可以保持按下的状态。
      

  6.   

    菜单是系统绘制的菜单啊,怎么用SetCapture?
      

  7.   


    LRESULT CxxxDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
    {
      if (message == WM_UNINITMENUPOPUP)
      {
        m_btn.SetState(FALSE);
      }
      return CDialog::WindowProc(message, wParam, lParam);
    }void CxxxDlg::OnContextMenu(CWnd* pWnd, CPoint point) 
    {
      CMenu Menu;
      Menu.CreatePopupMenu();
      //要动态创建菜单,自己AppendMenu吧
      //Menu.AppendMenu(...);
      //Menu.AppendMenu(...);
      m_btn.SetState(TRUE);
      Menu.TrackPopupMenu(TPM_CENTERALIGN, point.x, point.y, this);
      Menu.DestroyMenu();
    }
      

  8.   

    我这是在OnContextMenu里弹右键菜单,再加个判断void CxxxDlg::OnContextMenu(CWnd* pWnd, CPoint point) 
    {
      if (pWnd == (CWnd*)&m_btn)
      {
        CMenu Menu;
        Menu.CreatePopupMenu();
        //要动态创建菜单,自己AppendMenu吧
        //Menu.AppendMenu(...);
        //Menu.AppendMenu(...);
        m_btn.SetState(TRUE);
        Menu.TrackPopupMenu(TPM_CENTERALIGN, point.x, point.y, this);
        Menu.DestroyMenu();
      }
    }
      

  9.   

    感谢gfm688,也感谢各位回帖,我先试试
      

  10.   

    OnContextMenu必须用右键才能触发啊,如何使左键点击按钮也能触发呢
      

  11.   


    那只是个例子,不一定要OnContextMenu的,按钮的OnLButtonDown也行啊
      

  12.   


    void CxxxButton::OnLButtonDown(UINT nFlags, CPoint point) 
    {
      CMenu Menu;
      Menu.CreatePopupMenu();
      //要动态创建菜单,自己AppendMenu吧
      //Menu.AppendMenu(...);
      //Menu.AppendMenu(...);
      SetState(TRUE);
      ClientToScreen(&point);
      Menu.TrackPopupMenu(TPM_CENTERALIGN, point.x, point.y, this);
      Menu.DestroyMenu();
      //CButton::OnLButtonDown(nFlags, point);
    }LRESULT CxxxButton::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
    {
      if (message == WM_UNINITMENUPOPUP)
      {
        SetState(FALSE);
      }
      return CButton::WindowProc(message, wParam, lParam);
    }