动态产生了一个菜单, 子菜单项是不固定的
而且可能有很多子菜单项
我想通过获取用户点击的子菜单项上的字符来
写响应函数, 应如何去做

解决方案 »

  1.   

    是ON_COMMAND_RANGE吧ON_COMMAND_RANGE( id1, id2, memberFxn )响应id1到id2
      

  2.   

    在设计动态菜单的时候,菜单的ID号是设计时候就给定的,也就是说每个动态菜单的ID号是固定不变的,这样就可以通过消息响应函数处理动态菜单的每一项,以前自己写过,大概的思路就是这样。
      

  3.   

    在设计动态菜单的时候,菜单的ID号是设计时候就给定的,也就是说每个动态菜单的ID号是固定不变的,这样就可以通过消息响应函数处理动态菜单的每一项可不可以说一下如何通过消息响应函数处理动态菜单的每一项
      

  4.   


    LRESULT CAddSystemTryIconDlg::OnSystemTry(WPARAM wParam,LPARAM lParam)
    {
    char *ch[] = {"显示","隐藏","退出"};

    POINT pt;
    HMENU hMenu;
    CMenu *pMenu,menu;
    //CRect rect(100,100,100,100);
    if(wParam = WM_SYSTEMTRY)
    {
    switch(lParam)
    {
    case WM_LBUTTONDOWN:
    if(!ShowWindow(SW_HIDE))
    {
    ShowWindow(SW_SHOW);
    SetForegroundWindow();
    }
    break;
    case WM_RBUTTONDOWN:
    SetForegroundWindow();//设置前景窗口是为了当点击托盘图标后又点击了弹出菜单以外的地方,弹出菜单会自动隐藏

    /////////////////////////////////////////////////静态加载菜单/////////////////////////////////////////////
    /*
    ::GetCursorPos(&pt);
    menu.LoadMenu(IDR_MENU1);
    pMenu = menu.GetSubMenu(0);
    TrackPopupMenu(pMenu->m_hMenu,TPM_RIGHTALIGN,pt.x,pt.y,0,m_hWnd,NULL);
    */
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////动态加载菜单/////////////////////////////////////////////

    ::GetCursorPos(&pt);
    hMenu = CreatePopupMenu();//动态创建菜单
    InsertMenu(hMenu,1,MF_BYCOMMAND,IDM_NEXTSHOW,ch[0]);
    InsertMenu(hMenu,2,MF_BYCOMMAND,IDM_NEXTHIDE,ch[1]);
    InsertMenu(hMenu,3,MF_BYCOMMAND,IDM_EXIT,ch[2]);
    pMenu = CMenu::FromHandle(hMenu);
    pMenu->SetDefaultItem(IDM_NEXTSHOW);
    ::SetMenuItemBitmaps(hMenu,IDM_NEXTSHOW,MF_BYCOMMAND,HBITMAP(m_bitmap),HBITMAP(m_bitmap2));
    //Detach();
    TrackPopupMenu(hMenu,TPM_RIGHTALIGN,pt.x,pt.y,0,m_hWnd,NULL);

    //////////////////////////////////////////////////////////////////////////////////////////////////////////
    break;
    case WM_LBUTTONDBLCLK:
    break;
    }
    }
    return 1;
    }
      

  5.   

    LRESULT CAddSystemTryIconDlg::OnSystemTry(WPARAM wParam,LPARAM lParam)
    {
    char *ch[] = {"显示","隐藏","退出"};

    POINT pt;
    HMENU hMenu;
    CMenu *pMenu,menu;
    //CRect rect(100,100,100,100);
    if(wParam = WM_SYSTEMTRY)
    {
    switch(lParam)
    {
    case WM_LBUTTONDOWN:
    if(!ShowWindow(SW_HIDE))
    {
    ShowWindow(SW_SHOW);
    SetForegroundWindow();
    }
    break;
    case WM_RBUTTONDOWN:
    SetForegroundWindow();//设置前景窗口是为了当点击托盘图标后又点击了弹出菜单以外的地方,弹出菜单会自动隐藏

    /////////////////////////////////////////////////静态加载菜单/////////////////////////////////////////////
    /*
    ::GetCursorPos(&pt);
    menu.LoadMenu(IDR_MENU1);
    pMenu = menu.GetSubMenu(0);
    TrackPopupMenu(pMenu->m_hMenu,TPM_RIGHTALIGN,pt.x,pt.y,0,m_hWnd,NULL);
    */
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////动态加载菜单/////////////////////////////////////////////

    ::GetCursorPos(&pt);
    hMenu = CreatePopupMenu();//动态创建菜单
    InsertMenu(hMenu,1,MF_BYCOMMAND,IDM_NEXTSHOW,ch[0]);
    InsertMenu(hMenu,2,MF_BYCOMMAND,IDM_NEXTHIDE,ch[1]);
    InsertMenu(hMenu,3,MF_BYCOMMAND,IDM_EXIT,ch[2]);
    pMenu = CMenu::FromHandle(hMenu);
    pMenu->SetDefaultItem(IDM_NEXTSHOW);
    ::SetMenuItemBitmaps(hMenu,IDM_NEXTSHOW,MF_BYCOMMAND,HBITMAP(m_bitmap),HBITMAP(m_bitmap2));
    //Detach();
    TrackPopupMenu(hMenu,TPM_RIGHTALIGN,pt.x,pt.y,0,m_hWnd,NULL);

    //////////////////////////////////////////////////////////////////////////////////////////////////////////
    break;
    case WM_LBUTTONDBLCLK:
    break;
    }
    }
    return 1;
    }
      

  6.   


    void CAddSystemTryIconDlg::OnNextShow()
    {
    ::ShowWindow(m_hWnd,SW_SHOW);
    }void CAddSystemTryIconDlg::OnNextHide()
    {
    //ShowWindow(m_hWnd,SW_HIDE);
    ::ShowWindow(m_hWnd,SW_HIDE);
    }void CAddSystemTryIconDlg::OnExit()
    {
    OnClose();
    ::DestroyWindow(m_hWnd);
    }
      

  7.   

    可以直接在onmessage消息里面动态邦定消息函数,即消息id与响应函数的关系,如果id不断开是最好的阿
      

  8.   

    添加WM_COMMAND消息,利用switch判断,菜单Id可以临时给,但你要先预定一个范围,在试图的初始化时,别忘记把m_bAutoMenuEnable 设置为FALSE,否则你的动态菜单是灰的哦