右键弹出菜单,如何设置菜单状态

Feture_SW 2007-08-06 10:38:56
右键弹出菜单,如何设置菜单状态,比如有一个菜单项为Enable,
在OnUpdateEnable(CCmdUI* pCmdUI) 中设置pCmdUI->SetCheck();
我设置了,可是不起作用,跟踪进入该函数,发现有一个继承自
CCmdUI的类CTestCmdUI,而该类中SetCheck函数原型为

void CTestCmdUI::SetCheck(int)
{
// do nothing -- just want to know about calls to Enable
}
什么都不做。

但是在一个正常的菜单中,直接调用的是CCmdUI的SetCheck。

请知道原理的大侠们能详细解答。
...全文
1048 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
Feture_SW 2007-08-10
  • 打赏
  • 举报
回复
已经给分了,谢谢大家
Feture_SW 2007-08-10
  • 打赏
  • 举报
回复
实现没问题。就是想知道原理。
谢谢 lyg_zy(学无止境,宁静致远) 的回答,我明白了。
liuxiuk 2007-08-08
  • 打赏
  • 举报
回复
OnUpdateEnable(CCmdUI* pCmdUI)
{
pCmdUI->Enable( m_bFlag ); //m_bFlag 是添加的BOOL变量;
}
----
构造函数中 m_bFlag = TRUE;
菜单消息响应函数中 m_bFlag = FALSE;
----
不知道俺理解错了没
不用搞的太复杂..
systemthink 2007-08-08
  • 打赏
  • 举报
回复
你們說,我看
lyg_zy 2007-08-07
  • 打赏
  • 举报
回复
以上代码中与你问题相关的代码:
CTestCmdUI state;
state.m_nID = nID;
OnCmdMsg(nID, CN_UPDATE_COMMAND_UI, &state, NULL);
if (!state.m_bEnabled)
{
TRACE(traceAppMsg, 0, "Warning: not executing disabled command %d\n", nID);
return TRUE;
}
lyg_zy 2007-08-07
  • 打赏
  • 举报
回复
mfc的代码:
BOOL CWnd::OnCommand(WPARAM wParam, LPARAM lParam)
// return TRUE if command invocation was attempted
{
UINT nID = LOWORD(wParam);
HWND hWndCtrl = (HWND)lParam;
int nCode = HIWORD(wParam);

// default routing for command messages (through closure table)

if (hWndCtrl == NULL)
{
// zero IDs for normal commands are not allowed
if (nID == 0)
return FALSE;

// make sure command has not become disabled before routing
CTestCmdUI state;
state.m_nID = nID;
OnCmdMsg(nID, CN_UPDATE_COMMAND_UI, &state, NULL);
if (!state.m_bEnabled)
{
TRACE(traceAppMsg, 0, "Warning: not executing disabled command %d\n", nID);
return TRUE;
}

// menu or accelerator
nCode = CN_COMMAND;
}
else
{
// control notification
ASSERT(nID == 0 || ::IsWindow(hWndCtrl));

if (_afxThreadState->m_hLockoutNotifyWindow == m_hWnd)
return TRUE; // locked out - ignore control notification

// reflect notification to child window control
if (ReflectLastMsg(hWndCtrl))
return TRUE; // eaten by child

// zero IDs for normal commands are not allowed
if (nID == 0)
return FALSE;
}

#ifdef _DEBUG
if (nCode < 0 && nCode != (int)0x8000)
TRACE(traceAppMsg, 0, "Implementation Warning: control notification = $%X.\n",
nCode);
#endif

return OnCmdMsg(nID, nCode, NULL, NULL);
}

在命令执行之前,它会调用CTestCmdUI来测试命令是否可执行。

Feture_SW 2007-08-07
  • 打赏
  • 举报
回复
不是我自己定义的,是VC中的源文件,在这儿
C:\Program Files\Microsoft Visual Studio\VC98\MFC\SRC\WINCORE.CPP
Line:1993

// CTestCmdUI - used to test for disabled commands before dispatching

class CTestCmdUI : public CCmdUI
{
public:
CTestCmdUI();

public: // re-implementations only
virtual void Enable(BOOL bOn);
virtual void SetCheck(int nCheck);
virtual void SetRadio(BOOL bOn);
virtual void SetText(LPCTSTR);

BOOL m_bEnabled;
};

CTestCmdUI::CTestCmdUI()
{
m_bEnabled = TRUE; // assume it is enabled
}

void CTestCmdUI::Enable(BOOL bOn)
{
m_bEnabled = bOn;
m_bEnableChanged = TRUE;
}

void CTestCmdUI::SetCheck(int)
{
// do nothing -- just want to know about calls to Enable
}

void CTestCmdUI::SetRadio(BOOL)
{
// do nothing -- just want to know about calls to Enable

}

void CTestCmdUI::SetText(LPCTSTR)
{
// do nothing -- just want to know about calls to Enable
}
miaoshengwu 2007-08-07
  • 打赏
  • 举报
回复
楼主打开QQ发送信息的界面看看,
右键单击,有个“使用自定义表情”选项,
它是怎么实现的呢?

不妨这样试试,
定义一变量,
点击的时候改变其值,
下次右键单击那个选项时再根据上次修改的值创建对应的右键菜单。

仅供参考
flypig917 2007-08-07
  • 打赏
  • 举报
回复
HMENU hmenu=LoadMenu(AfxGetInstanceHandle(),(char*)IDR_MENU1);
m_menu.m_hMenu=hmenu;
CheckMenuItem(hmenu,ID_MENUITEM32778,0);//CheckMenuItem()函数0:NO 8:YES
flypig917 2007-08-07
  • 打赏
  • 举报
回复
CheckMenuItem()函数0:NO 8:YES
SJcinux 2007-08-07
  • 打赏
  • 举报
回复
OnUpdate***消息由CWinApp中OnIdle调用,因为更新UI的操作是在Idle的时候。
如果你要改变右键弹出菜单状态,可以在TrackPopupMenu前通过CheckMenuItem、EnableMenuItem实现。
zhugay 2007-08-06
  • 打赏
  • 举报
回复
void CTestCmdUI::SetCheck(int)
存在于vc6的哪个文件中,或者是你自己的文件吗?
Feture_SW 2007-08-06
  • 打赏
  • 举报
回复
这样是可以了,可是我想知道的是在OnUpdate***这个函数中去设置菜单状态时,
为什么调用了CTestCmdUI这个类。
谢谢你的回答。
ndy_w 2007-08-06
  • 打赏
  • 举报
回复
TrackPopupMenu之前改变的check状态吗?
Feture_SW 2007-08-06
  • 打赏
  • 举报
回复
谢谢楼上的回答,我试了你说的,可是还是不行。
ndy_w 2007-08-06
  • 打赏
  • 举报
回复
TrackPopupMenu最后一个参数改为AfxGetMainWnd()
Feture_SW 2007-08-06
  • 打赏
  • 举报
回复
怎么每人回答我,顶一下

16,472

社区成员

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

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

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