对话框程序上放置了一个RichEdit控件,当鼠标右键点击RichEdit时,弹出一个自定义的菜单,但是当鼠标移动到菜单上时,鼠标的箭头任然是“I”形状。如何让鼠标箭头变成标准的箭头?鼠标离开右键菜单后又变回“I”形?子类化后的RichEdit类响应右键事件void CMyRichEdit::OnRButtonDown(UINT nFlags, CPoint point) 
{
//设置为焦点
SetFocus();
//设置鼠标样式
SetCursor(AfxGetApp()->LoadStandardCursor(IDC_HAND));  //##这个语句不起作用##

//创建一个弹出式菜单
CMenu popmenu;
popmenu.CreatePopupMenu();
//添加菜单项目
popmenu.AppendMenu(0, ID_RICH_UNDO, _T("撤销(&U)      "));
popmenu.AppendMenu(0, MF_SEPARATOR);
popmenu.AppendMenu(0, ID_RICH_CUT, _T("剪切(&X)      "));
popmenu.AppendMenu(0, ID_RICH_COPY, _T("复制(&C)      "));
popmenu.AppendMenu(0, ID_RICH_PASTE, _T("粘贴(&P)      "));
popmenu.AppendMenu(0, ID_RICH_CLEAR, _T("清除(&L)      "));
popmenu.AppendMenu(0, MF_SEPARATOR);
popmenu.AppendMenu(0, ID_RICH_SELECTALL, _T("全选(&A)      "));
popmenu.AppendMenu(0, MF_SEPARATOR);
popmenu.AppendMenu(0, ID_RICH_SETFONT, _T("字体(&F)...     ")); //初始化菜单项
UINT nUndo = (CanUndo() ? 0 : MF_GRAYED );
popmenu.EnableMenuItem(ID_RICH_UNDO, MF_BYCOMMAND|nUndo); UINT nSel = ((GetSelectionType()!=SEL_EMPTY) ? 0 : MF_GRAYED) ;
popmenu.EnableMenuItem(ID_RICH_CUT, MF_BYCOMMAND|nSel);
popmenu.EnableMenuItem(ID_RICH_COPY, MF_BYCOMMAND|nSel);
popmenu.EnableMenuItem(ID_RICH_CLEAR, MF_BYCOMMAND|nSel);

UINT nPaste = (CanPaste() ? 0 : MF_GRAYED) ;
popmenu.EnableMenuItem(ID_RICH_PASTE, MF_BYCOMMAND|nPaste); //显示菜单
CPoint pt;
GetCursorPos(&pt);
popmenu.TrackPopupMenu(TPM_RIGHTBUTTON, pt.x, pt.y, this);
popmenu.DestroyMenu(); CRichEditCtrl::OnRButtonDown(nFlags, point);
}

解决方案 »

  1.   

    SetCursor(theApp.LoadCursor(IDB_ARROW1));
      

  2.   

    在OnMouseMove函数中判断当前鼠标point是否位于弹出菜单的的Rect区域中PtInRect(...); 
    如果位于弹出菜单的的Rect区域中,就SetCursor(AfxGetApp()->LoadCursor(IDC_HAND));
    以上只是思路,楼主可以试一下。
      

  3.   

    > てあるのですが、右クリックした後にカーソルを矢印カーソルに変更したのですが、
    >  :
    >   hCursor = AfxGetApp()->LoadCursor(IDC_ARROW);
    >   SetCursor(hCursor);これだと「自分のアプリケーションで定義したIDC_ARROWカーソル」をセット
    しに行くんですが、ちゃんと取れてますか? システム定義のIDC_ARROWを
    取得するにはWin32APIを叩くしかありませんが。
    特に問題なくできるようですが(メニュー自体は表示してないけども)。
    ====
    CRichCustom::CRichCustom()
    {
      m_hCur = LoadCursor(NULL,IDC_ARROW);
      m_bCur = FALSE;
    }void CRichCustom::OnContextMenu(CWnd* pWnd, CPoint point) 
    {
      m_bCur = !m_bCur;
      CRichEditCtrl::OnContextMenu(pWnd,point);
    }BOOL CRichCustom::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 
    {
      if (m_bCur != FALSE) {
        SetCursor(m_hCur);
        return  TRUE;
      }
      return CRichEditCtrl::OnSetCursor(pWnd, nHitTest, message);
    }
    ====
    # Win2000SP1,VC6SP5-- 
    悪魔-VFC-LINK  [email protected] 
      

  4.   

    改变右键菜单上的指针类型(20120929) 
    情景:
    我做了个对话框,里面只包含一个富文本框。对应的类为CCmdRichEdit继承自CRichEditCtrl。
    因为默认的CRichEditCtrl它不像CEdit那样,单击右键时是不会弹出菜单的。因此我自己实现了“复制”,“粘贴”,“剪切”功能的右键菜单。
    随后发现,功能一切正常,但是当鼠标移至菜单上时,没有变成常见的那种箭头式指针。
    过程:
    尝试了在OnContextMenu,OnMouseMove, 中调用::SetCursor(LoadCursor(NULL, IDC_ARROW));
    都不起作用。
    注意:
    每次移动鼠标,OnMouseMove都会默认的改变指针的样式,但在里面修改却对右键菜单不起作用。
    解决办法:
    1、设置个类变量m_bContext,在OnContext开始和结束分别设为 TRUE和FALSE;
    2、OnSetCursor中根据m_bContext来改变光标形式。BOOL CCmdRichEdit::OnSetCursor(CWnd *pWnd, UINT nHitTest, UINT message)
    {
        //文本框右键的指针设为箭头
        if(m_bShowContext)
        {
            ::SetCursor(LoadCursor(NULL, IDC_ARROW));
            return TRUE;
        }
        
        return CRichEditCtrl::OnSetCursor(pWnd, nHitTest, message);
    }