我的弹出菜单出麻烦了!

dgcat_6 2001-07-15 12:26:12
在我的SDI应用程序里,静态拆分成两个窗口(派生于FORMVIEW)。我希望它们有各自的菜单。也就是当某一视为活动时,菜单自动替换?我该在什么地方触发?假设左视的菜单为IDR_LEFT,右视的菜单为IDR_RIGHT,框架的菜单为IDC_MAINFRAME。这段代码如何写?
另外,我在左视的OnContextMenu(CWnd* pWnd,CPoint pos)中无法更改EIDT控件(IDC_ED_NAME)的上下文菜单?
我的代码如下:
void CLeftView::OnContextMenu(CWnd* pWnd,CPoint pos)
{
if(pWnd==(CWnd*)GetDlgItem(IDC_ED_NAME))
{
CMenu mnu;
mnu.LoadMenu(IDC_LEFT);
CMenu* pMnu=mnu.GetSubMenu(4);
pMnu->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_RETURNCMD,
point.x,point.y,this);
}
}
但弹出的菜单依然是系统的菜单(粘贴、复制等内容),我自己的代码好象不起作用!怎么办?
...全文
135 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
dgcat_6 2001-07-21
  • 打赏
  • 举报
回复
买单!
dgcat_6 2001-07-17
  • 打赏
  • 举报
回复
xlfrd:我想你的说法基本能解释这个原因。我在看看有没有更好的见解!三天后我让这个问题消失。欢迎大家发表自己的看法。
xlfrd 2001-07-16
  • 打赏
  • 举报
回复
OnLeftFocus()
{
……
m_hFrameMenu=::GetWindowLong(GetParent()->GetSafeHwnd(),GWL_ID);//之前先保存框架菜单
::SetWindowLong(GetParent()->GetSafeHwnd(),GWL_ID,(UINT)LoadMenu(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_LEFTMENU)));//更换框架菜单
::SetWindowPos(GetParent()->GetSafeHwnd(),NULL,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_FRAMECHANGED);//刷新框架
……
}
这是动态切换框架菜单的代码。


你说的第二个问题中的LEFTVIEW是不是CEDIT的父窗口?如果是的话就接收不到WM_CONTEXTMENU,重载CEDIT的ONCONTEXTMENU()就可以。
tengy1 2001-07-16
  • 打赏
  • 举报
回复
zhu !
xlfrd 2001-07-16
  • 打赏
  • 举报
回复
这个可能跟MFC消息路由有关,子窗口的消息已处理后就不会再发向父窗口了,按钮没有处理WM_CONTEXTMENU自然父窗口就能收到,EDIT则相反。我自己试了试,用Spy++拦截父窗口消息发现只有EIDT不能(包括含有EIDT的COMBOBOX),其它大多控件(LISTBOX、LISTCTRL、SCROLLBAR、IMAGE等)都能使父窗口收到WM_CONTEXTMENU消息。如果你不愿用重载的办法,可能只有设局部HOOK,换WNDPROC这些更麻烦的办法了。
dgcat_6 2001-07-16
  • 打赏
  • 举报
回复
xlfrd:我的CLeftView是从FORMVIEW派生的。上面有EDIT、COMMANDBUTTON。我重载CLeftView::OnContextMenu,想当鼠标移动到EDIT、COMMANDBUTTON时实现各自的上下文菜单。
在按钮处能正常实现,但在EDIT处就不对了。我想在一个OnContextMenu处理完这些,先不考虑单独针对EDIT的弹出菜单的其他方式。
LEFTVIEW是CEDIT的父窗口,但同样也是CBUTTON的父窗口呀!怎么CBUTTON能收到而CEDIT收不到,奇怪!
代码如下:
void CLeftView::OnContextMenu(CWnd* pWnd,CPoint pos)
{
CMenu mnu;
CMenu* pPopupMnu;
DWORD dwSelected;
//按钮的菜单处理
if(pWnd==(CWnd*)GetDlgItem(IDC_BTNMENU))
{
mnu.LoadMenu(IDR_MENUBTN);
pPopupMnu=mnu.GetSubMenu(0);
dwSelected=pPopupMnu->TrackPopupMenu (TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_RETURNCMD,point.x,point.y, this);
}
//EDIT菜单的处理
if(pWnd==(CWnd*)GetDlgItem(IDC_EDIT))
{
mnu.LoadMenu(IDR_EDITMENU);
pPopupMnu=mnu.GetSubMenu(0);
dwSelected=pPopupMnu->TrackPopupMenu(TPM_CENTERALIGN|TPM_LEFTBUTTON,
point.x ,point.y ,this);
}
}

我知道,可以分别针对各个控件做出弹出菜单的处理。但既然我在这里面遇到问题,我希望针对这种情况考虑问题的解决方法!请指点!
不解 2001-07-16
  • 打赏
  • 举报
回复
发代码看看。whj@sdu.edu.cn
dgcat_6 2001-07-15
  • 打赏
  • 举报
回复
我只考虑在这里面解决!不考虑拦截EDIT的RBUTTONDOWN等处理方式!
cchuocp 2001-07-15
  • 打赏
  • 举报
回复
OnFocus
{
LoadMenu
SetMenu
}
dgcat_6 2001-07-15
  • 打赏
  • 举报
回复
看的人多!动手的人少!
dgcat_6 2001-07-15
  • 打赏
  • 举报
回复
help!!!!!!!1

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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