右键弹出菜单,如何设置菜单状态
右键弹出菜单,如何设置菜单状态,比如有一个菜单项为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;
----
不知道俺理解错了没
不用搞的太复杂..