如何判断窗口是否有右键菜单,如何得到该右键菜单的位置?

deping_chen 2009-10-23 01:43:59
我写了一个编辑框,类似于Edit控件,不要问我为什么,我有充分的理由这么干.
现在的问题是当我在OnSetCursor里把光标改成I形时,当光标移到右键菜单上时,居然也是I形的.
Notepad的行为是当有右键菜单时,整个窗口都是箭形光标.
Visual Studio 2005的编辑器最好,当有右键菜单式,光标移到右键菜单上显示为箭形,移到编辑窗口恢复为I形.
请高手指教.
我的分比较少,只能给这么多,不是我小气,请见谅.
...全文
254 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
deping_chen 2009-10-25
  • 打赏
  • 举报
回复
谢谢小辛!那篇文章写的不错!我现在相信弹出菜单是类名为#32768的窗口了.我原先测试不成功的原因是我假设弹出菜单是我的CEditCtrl的子窗口,其实不是的.弹出菜单的Owner窗口时CEditCtrl窗口.

我已经通过在本线程安装鼠标消息钩子监视WM_MOUSEMOVE达到了我的目的.
DavidHsing 2009-10-23
  • 打赏
  • 举报
回复
找到了,你自己看:
http://www.codeproject.com/KB/menus/trans_menu.aspx

1.Handling WM_INITMENUPOPUP
In this method, we will be handling WM_INITMENUPOPUP message. From MSDN, "The WM_INITMENUPOPUP message is sent when a drop-down menu or submenu is about to become active. This allows an application to modify the menu before it is displayed, without changing the entire menu". What is done is that, when WM_INITMENUPOPUP is generated, the menu will already be created. So we will be using FindWindow() API to get HWND of the menu. Then we will be modifying menu, to suit our purpose. Class name for menu is #32768.
DavidHsing 2009-10-23
  • 打赏
  • 举报
回复
菜单本来就是窗口,不用假设。
这个在 CodeProject 里面有说的,具体哪篇文章一时想不起来了,好像在某个自定义菜单类里面,作者的说明。
deping_chen 2009-10-23
  • 打赏
  • 举报
回复
我响应WM_MENUSELECT消息,光标移到菜单上时确实显示箭形光标了,但是一旦移开,仍然显示箭形光标,仍然和我的希望差一点...
deping_chen 2009-10-23
  • 打赏
  • 举报
回复
把OnSetCursor的内容放到OnMouseMove,仍然没有效果.
注:CEditCtrl是我写的Edit控件的派生类.可能你用CEdit无法看到我看到的效果.
deping_chen 2009-10-23
  • 打赏
  • 举报
回复
假设菜单是一种窗口,我做了两次试验,结果并不如预期.所以行不通.
不信自己试试,很简单,创建一个对话框,里面放一个编辑框,响应WM_CONTEXTMENU消息,使编辑框有对象菜单,响应WM_SETCURSOR,根据对象菜单的存在与否设置光标形状.

下面是我的两次试验的OnSetCursor代码,可以复制,加快试验速度.
BOOL CEditCtrl::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
CWnd* pChild = CWnd::FindWindowEx(m_hWnd, NULL, "#32768", NULL);
BOOL bOnMenu = pChild != NULL;
LPCSTR cursor = bOnMenu ? IDC_ARROW : IDC_IBEAM;
::SetCursor(LoadCursor(NULL, cursor));
return TRUE;
}

BOOL CEditCtrl::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
POINT point;
GetCursorPos(&point);
ScreenToClient(&point);
CWnd* pChild = ChildWindowFromPoint(point);
char className[48];
BOOL bOnMenu = FALSE;
if(pChild && pChild != this)
{
::GetClassName(pChild->m_hWnd, className, _countof(className));
if(strcmp(className, "#32768")==0)
bOnMenu = TRUE;
}
LPCSTR cursor = bOnMenu ? IDC_ARROW : IDC_IBEAM;
::SetCursor(LoadCursor(NULL, cursor));
return TRUE;
}
DavidHsing 2009-10-23
  • 打赏
  • 举报
回复
of course !
deping_chen 2009-10-23
  • 打赏
  • 举报
回复
菜单是窗口么?
DavidHsing 2009-10-23
  • 打赏
  • 举报
回复
菜单类名:#32768
::FindWindow 和 ::FindWindowEx

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧