网上有很多关于菜单变成灰色的方法,可是我发现我用On_Commmand_UI这种方法对于快捷菜单(也就是右键弹出的菜单)好像没有什么作用啊。我在CTreeCtrl中建立了一个快捷菜单,然后在这个类里面添加了On_Command_UI的消息相应函数,结果不管我设置的TRUE还是FALSE,菜单都是黑色,没有变成灰色啊,我试了一下,只有那种一般的菜单消息相应才管用啊,快捷菜单好像不行啊。问问高手,如何解决这个问题啊
解决方案 »
- 结构体指针作为函数返回值时怎样定义函数?
- 刚发现咱也混成3个裤衩了
- 聊天程序的错误:socket notification sink
- 如何使基于对话框类的窗口可以自由的调整大小?
- 线程变量改变问题
- 有CserialPortEx类的朋友请把源代码发给我,谢谢;
- 为何中文显示为乱码???
- 类实例化的问题,请看以下两种实例化方式有什么不同?谢谢。。。
- [求助]关于线程句柄的CloseHandle()
- 如何把一个BSTR型的CComVariant变量复制到_bstr_t型变量中
- vs2005 debug模式为何无法调试?在程序debug目录加入vc库,则可调试。
- Socket Connect的一个问题
使用过MFC的都知道,自制的左键弹出菜单不会响应自动更新.除非你的左键菜单同时做到了主菜单上,才能响应自动更新,这是让人无法容忍的.如:你在资源中做好弹出菜单,如IDR_POPUP,项ID从ID_POPUPMENU_FIRST到ID_POPUPMENU_LAST,按照自动更新的常规做法://首先做好自动更新宏
ON_UPDATE_COMMAND_UI_RANGE(ID_POPUPMENU_FIRST, ID_POPUPMENU_LAST, OnUpdatePopupMenuCmd)
//再声明更新消息函数
afx_msg void OnUpdatePopupMenuCmd(CCmdUI* pCmdUI);
//再做好函数
void CYourView::OnUpdatePopupMenuCmd(CCmdUI* pCmdUI)
{
BOOL bEnable = FALSE;
switch (pCmdUI->m_nID)
{
case ID_POPUPMENU_FIRST:
if (....)
{
bEnable = TRUE;
}
break;
case //........
case ID_POPUPMENU_LAST:
if (....)
{
bEnable = TRUE;
}
break;
}
pCmdUI->Enable(bEnable);
}
//在WM_CONTEXTMENU消息中做好弹出代码,或把代码放到WM_RBUTTONUP消息中
void CYourView::OnContextMenu(CWnd* pWnd, CPoint point)
{
HMENU hMenu = ::LoadMenu(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(IDR_POPUP));//弹出菜单资源
HMENU hPopup = GetSubMenu(hMenu, 0);//第0个子菜单
POINT pt = {point.x, point.y};
::ClientToScreen(m_hWnd, &pt);
::TrackPopupMenu(hPopup, TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_VERTICAL, pt.x, pt.y, 0, m_hWnd, NULL);//弹出它
}你运行时会发现,你的弹出的菜单不会响应自动更新.跟踪一下,你会发现,你的自动更新函数没有被执行.如何做才能让左键弹出菜单响应自动更新呢?其实很简单://添加WM_INITMENUPOPUP消息响应函数
void CYourView::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu)
{
CScrollView::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu);
int nCount = pPopupMenu->GetMenuItemCount();
CCmdUI cmd;//创建自动更新类
cmd.m_pMenu = pPopupMenu;
cmd.m_nIndexMax = nCount;//MSDN上未介绍的成员变量
for (int i = 0; i < nCount; i ++)
{
UINT nID = pPopupMenu->GetMenuItemID(i);
if (nID != 0)//如果不是分隔符
{
cmd.m_nIndex = i;
cmd.m_nID = nID;
cmd.DoUpdate(this, TRUE);//MSDN上未介绍的成员函数,可以找到自动更新宏,传入CCmdUI指针,来执行自动更新
}
}
}这样就可以了,以上代码在VC6.0上测试通过...