对话框程序上放置了一个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);
}
{
//设置为焦点
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);
}
解决方案 »
- 验证编辑框输入的内容的问题!
- fatal error C1010: unexpected end of file while looking for precompiled header directive???
- 关于TerminateProcess()
- 不是高手不要进——模版类编译问题
- 请问在vc中如何使用cout?
- error LNK2001: unresolved external symbol _atexit
- 有关活动目录编程的问题,急!!!
- 请问如何将系统标准的字体选择对话框加入到我的对话框中应用?
- 我是一个新手。请问在学习别人的程序时怎样很快找到一个BUTTON的响应事件代码,先谢谢了
- 怎样把CString转为long类型或int类型?
- MFC ListControl 怎么修改字体大小 怎么使一行中的特定列颜色改变
- toolbar 的例子有没有。
如果位于弹出菜单的的Rect区域中,就SetCursor(AfxGetApp()->LoadCursor(IDC_HAND));
以上只是思路,楼主可以试一下。
> :
> 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]
情景:
我做了个对话框,里面只包含一个富文本框。对应的类为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);
}