关于右件弹出menu的问题

chenqsbeast 2003-11-21 02:27:12
针对一个list,右件时弹出menu,menu的每一个item的On_Command都有了,可是,弹出的menu始终是灰色的(不可执行),这是为什么
...全文
75 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
hardstudylulin 2003-11-21
  • 打赏
  • 举报
回复
根据ID给菜单加上消息映射,就好了。
gaoxiaopai 2003-11-21
  • 打赏
  • 举报
回复
...
carbon107 2003-11-21
  • 打赏
  • 举报
回复
// if(m_LocalMachineList.GetItemCount()<=0)//我的list列表
// return;
LPNMLISTVIEW lpnmlv = (LPNMLISTVIEW)pNMHDR;
CPoint point;
::GetCursorPos(&point);
CMenu menu;
VERIFY(menu.LoadMenu(IDR_MENU1));//IDR_FILE_LOCAL我的按钮里面有2个Item,而且他们对应的On_Command都有了
CMenu* pPopup = menu.GetSubMenu(0);
ASSERT(pPopup != NULL);
//if(lpnmlv->iItem<0)
// pPopup->EnableMenuItem(IDR_FILE_LOCAL_DELFILE,MF_GRAYED);
CWnd* pWndPopupOwner = this;
while (pWndPopupOwner->GetStyle() & WS_CHILD)
pWndPopupOwner = pWndPopupOwner->GetParent();
pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,
pWndPopupOwner);

我试过了,没有你说的那种情况,对,看看你的IDR_FILE_LOCAL 是否有问题
chenqsbeast 2003-11-21
  • 打赏
  • 举报
回复
谢谢大家,问题我自己解决了 给分
carbon107 2003-11-21
  • 打赏
  • 举报
回复
void CBnbDlg::OnRclickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
CMenu menu;

// 装入菜单
menu.LoadMenu(IDR_MENU1);
CPoint point;
::GetCursorPos(&point);
// 显示菜单
menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_RIGHTBUTTON, point.x, point.y, this);
*pResult = 0;
}

我这样都不是灰色啊
beyondtkl 2003-11-21
  • 打赏
  • 举报
回复
你单步执行下,能到这里面吗,如果是这样,那可不变灰了
if(lpnmlv->iItem<0)
pPopup->EnableMenuItem(IDR_FILE_LOCAL_DELFILE,MF_GRAYED);

// 这步是判断右键是否是点击在一条记录上 没有点击在记录上 当然是灰色的

那你去资源看看这个菜单是否在资源里最初就是灰的??
我以前有经过这样的事情。
carbon107 2003-11-21
  • 打赏
  • 举报
回复
我有qq:373965
msn carbon107@hotmail.com
联系我吧,我帮你看看
chenqsbeast 2003-11-21
  • 打赏
  • 举报
回复
我自己顶到前面去!
chenqsbeast 2003-11-21
  • 打赏
  • 举报
回复
to carbon107(<软件开发思想.h>)
这步走不到!
chenqsbeast 2003-11-21
  • 打赏
  • 举报
回复
to topwork(日光)
不是这里的问题,我改过!
carbon107 2003-11-21
  • 打赏
  • 举报
回复
你单步执行下,能到这里面吗,如果是这样,那可不变灰了
if(lpnmlv->iItem<0)
pPopup->EnableMenuItem(IDR_FILE_LOCAL_DELFILE,MF_GRAYED);
chenqsbeast 2003-11-21
  • 打赏
  • 举报
回复
to 楼上
我没说清楚list----〉CListCtrl
topwork 2003-11-21
  • 打赏
  • 举报
回复
MF_GRAYED!!!!!!!!!!!不灰才怪呢。
carbon107 2003-11-21
  • 打赏
  • 举报
回复
list???
是什么list,有没有OnContextMenu这个事件
carbon107 2003-11-21
  • 打赏
  • 举报
回复
//是这样的吗

CMenu menu;

// 装入菜单
menu.LoadMenu(IDR_MENU1);

// 显示菜单
menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_RIGHTBUTTON, point.x, point.y, this);
chenqsbeast 2003-11-21
  • 打赏
  • 举报
回复
工程很大的!发布来!下面右件的程序void FtpFileManageTab::OnRclickLocalMachineList(NMHDR* pNMHDR, LRESULT* pResult)
{
if(m_LocalMachineList.GetItemCount()<=0)//我的list列表
return;
LPNMLISTVIEW lpnmlv = (LPNMLISTVIEW)pNMHDR;
CPoint point;
::GetCursorPos(&point);
CMenu menu;
VERIFY(menu.LoadMenu(IDR_FILE_LOCAL));//IDR_FILE_LOCAL我的按钮里面有2个Item,而且他们对应的On_Command都有了
CMenu* pPopup = menu.GetSubMenu(0);
ASSERT(pPopup != NULL);
if(lpnmlv->iItem<0)
pPopup->EnableMenuItem(IDR_FILE_LOCAL_DELFILE,MF_GRAYED);
CWnd* pWndPopupOwner = this;
while (pWndPopupOwner->GetStyle() & WS_CHILD)
pWndPopupOwner = pWndPopupOwner->GetParent();
pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,
pWndPopupOwner);
}
bohut 2003-11-21
  • 打赏
  • 举报
回复
bohut@163.com代码给我看看,你的邮箱也告诉我,我改完后给你
对dhtmlXTree进行一个小的扩展 需求1: 动态生成树形菜单,每个节点都有各自的URL地址,单击不同的节点框架页的右侧跳转到该节点所对应的URL。(框架页说明:左边是树形菜单;右边是显示页面相应信息的页面) 分析: dhtmlXTree提供了很好的添加,删除节点的方法,故选择dhtmlXTree。 但是dhtmlXTree不能满足"每个节点都有各自的URL地址,单击不同的节点框架页的右侧跳转到该节点所对应的URL"这点需求,因次想到了对dhtmlXTree进行一个小的扩展,即在其节点对象原有属性的基础上,再添加两个扩展属性。具体操作如下: 1、找到定义节点对象的那个函数(或方法) function dhtmlXTreeItemObject(itemId,itemText,parentObject,treeObject,actionHandler,mode) 修改为 function dhtmlXTreeItemObject(itemId,itemText,parentObject,treeObject,actionHandler,mode,url,target) 并在方法体中添加赋值语句:this.itemURL=url;this.itemTarget=target; 2、然后修改所有与dhtmlXTreeItemObject有关(直接或者间接相关)的方法: _attachChildNode,insertNewItem,insertNewChild,insertNewNext,_recreateBranch,_parseXMLTree 注:_parseXMLTree方法是与loadXML,loadXMLString相关的。 在这些方法中生成节点的语句中添加相应的参数和语句,以支持新添加的属性itemURL,itemTarget。 需求2: 为dhtmlXTree树上的每一个节点添加右键菜单。附:在树上的节点上点右键时才会生成菜单,空白区域单击时不会生成菜单。 分析: 1、用 dhtmlXTree + dhtmlxmenu 实现。 2、 用dhtmlxmenu生成菜单的部分代码: var menu = new dhtmlXMenuObject(); menu.setImagePath("imgs/"); menu.setIconsPath("images/"); menu.renderAsContextMenu(); menu.loadXML("dhtmlxmenu.xml?e="+new Date().getTime()); menu.addContextZone("treeboxbox_tree"); menu.addContextZone方法是为了把菜单添加到指定区域。 3、dhtmlXTreeObject.prototype._createItem方法是构造树形菜单上元素的具体实现方法。看这个方法的具体操作,可以发现它为每一个节点构建了一个table,节点的内容(即名字)放置在一个span中。 4、考虑到dhtmlxmenu实在指定的区域构建菜单,所以可以为dhtmlXTree树上的每一个节点添加右键事件,在这个右键事件里获得该节点对象所对应的区域,然后在这个区域内构建Menu菜单。 难点和解决方案: 1、怎样获得dhtmlXTree树上的每一个节点对象所对应的区域?(dhtmlXTreeObject.prototype._createItem方法没有为这个节点的span设置id) 解决方法: 在dhtmlXTreeObject.prototype._createItem方法中添加一个为span设置id的语句: 即: 在itemObject.span=document.createElement('span'); itemObject.span.className="standartTreeRow"; 后,新添加一句 itemObject.span.id="treeNode_"+itemObject.id;//为这个span新增一个Id属性 2、为dhtmlXTree树上的每一个节点添加右键事件,在这个右键事件里获得该节点对象所对应的区域,然后在这个区域内构建Menu菜单。 解决方法: a、为dhtmlXTree树上的每一个节点添加右键事件: tree.setOnRightClickHandler(treeOnRegihtClick);//右键事件 b、构建Menu菜单: var menu = new dhtmlXMenuObject(); function treeOnRegihtClick(id){ alert("右键 "+" span.id:"+tree.getItem(id).span.id); menu.setImagePath("imgs/"); menu.setIconsPath("images/"); menu.renderAsContextMenu(); menu.loadXML("dhtmlxmenu.xml?e="+new Date().getTime()); menu.addContextZone(tree.getItem(id).span.id);alert("width:"+tree.getItem(id).span.clientWidth); //var X=tree.getItem(id).span.getBoundingClientRect().left; //var Y=tree.getItem(id).span.getBoundingClientRect().top; var X=document.getElementById('mouseXPosition').value;//获得鼠标的横坐标位置 var Y=document.getElementById('mouseYPosition').value;//获得鼠标的纵坐标位置 menu.showContextMenu(X,Y);//调用showContextMenu方法显示菜单 说明:如果这儿不加上这条语句的话,第一次点击右键时只能生成菜单,但是显示不出菜单,下次点击右键Menu菜单才能弹出。 //menu._showContextMenu(X,Y,tree.getItem(id).span.id); } c、用 javascript 获取当页面上鼠标(光标)位置 <script type="text/javascript"> // 说明:获取鼠标位置 function mousePosition(ev){ if(ev.pageX || ev.pageY){ return {x:ev.pageX, y:ev.pageY}; } return { x:ev.clientX + document.body.scrollLeft - document.body.clientLeft, y:ev.clientY + document.body.scrollTop - document.body.clientTop }; } document.onmousemove = mouseMove; function mouseMove(ev){ ev = ev || window.event; var mousePos = mousePosition(ev); document.getElementById('mouseXPosition').value = mousePos.x; document.getElementById('mouseYPosition').value = mousePos.y; }

16,551

社区成员

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

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

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