首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

右键弹出菜单,怎么设置菜单状态

2012-01-30 
右键弹出菜单,如何设置菜单状态右键弹出菜单,如何设置菜单状态,比如有一个菜单项为Enable,在OnUpdateEnabl

右键弹出菜单,如何设置菜单状态
右键弹出菜单,如何设置菜单状态,比如有一个菜单项为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。

请知道原理的大侠们能详细解答。

[解决办法]
TrackPopupMenu最后一个参数改为AfxGetMainWnd()
[解决办法]
void CTestCmdUI::SetCheck(int)
存在于vc6的哪个文件中,或者是你自己的文件吗?
[解决办法]
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来测试命令是否可执行。


[解决办法]
OnUpdate***消息由CWinApp中OnIdle调用,因为更新UI的操作是在Idle的时候。
如果你要改变右键弹出菜单状态,可以在TrackPopupMenu前通过CheckMenuItem、EnableMenuItem实现。
[解决办法]
CheckMenuItem()函数0:NO 8:YES
[解决办法]
楼主打开QQ发送信息的界面看看,
右键单击,有个“使用自定义表情”选项,
它是怎么实现的呢?

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

仅供参考
[解决办法]
你們說,我看
[解决办法]
OnUpdateEnable(CCmdUI* pCmdUI)
{
pCmdUI-> Enable( m_bFlag ); //m_bFlag 是添加的BOOL变量;
}
----
构造函数中 m_bFlag = TRUE;
菜单消息响应函数中 m_bFlag = FALSE;
----
不知道俺理解错了没
不用搞的太复杂..

热点排行