踢!!999999999999999999999999999999999999999999999999999
999999999999999999999999999999999999999999999999999
99999999999B@B@B@BBBMMMM999999999999999999999999999
999999999999M+:.:+9999M:999999999999999999999999999
9999999999999MM9+99MMM:9999999999999999999999999999
99999999999999M+.+99M:99999999999999999999999999999
99999999999999B:.++9M:99999999999999999999999999999
99999999999999B+.+99M:9999AAAAAA9999999999999999999
99999999999999B:.++9M:9AAA++++:+AAA9999999999999999
99999999999999B+.+99M:A+9+A:+++++9AA999999999999999
99999999999999B:.++9:A+@+A:,:++9+A9@M99999999999999
99999999999999B+.+9:A+A,,,,,,+A+A9@A@M9999999999999
99999999999999B:.++A+A+,,.,,+A9A9@A@M@M999999999999
99999999999999B+.+9AA+,,...,++A9@A@A@MM999999999999
99999999999999B:.+:A+++,,.,,++9@A@A@M@M999999999999
99999999999999B+.+A+@+,,,,,+9A@A+@@M@M@M99999999999
99999999999999B:.+A@+++,+,+9A9A++@M@M@MM99999999999
99999999999999B+.+A+@++++++A9A++9M@M@M@M99999999999
99999999999999B:.+A@+@+:+9A9A9A9M@M@M@9M99999999999
0A999999999999B+.+A+@+@+@+@+@A@A@9@9@9@M99999999999
99999999999999B:.+A@+@+@+@+@+@A@M@9@9@9M99999999999
99999999999999B+.+:A@+@+@+@+@A@M@9@9@9M999999999999
99999999999999B:.+:A9@+@+@+@9@A@M@9@9@M999999999999
99999999993333333333M9@9@9@9@9@M@9@9@9M999999999999
99999999993.........MAA99@9@9@M@9@9@9M9999999999999
99999999993...MMMM..MM@9@9@9@9@M@9@9M99999999999999
99999999993....MMM..M:M@9@9@9@9@9@9M999999999999999
99999999993...MMMM..M:9MMM@9@9@9MMM9999999999999999
99999999993..MMM.M..M:9999MMMMMM9999999999999999999
99999999993..MM.....M:99999999999999999999999999999
99999999993..M......M:99999999999999999999999999999
99999999993...M.....MM:9999999999999999999999999999
99999999993.........M9M:999999999999999999999999999
9999999999MMMMMMMMMMMMMM:99999999999999999999999999
999999999999999999999999999999999999999999999999999
999999999999999999999999999999999999999999999999999
999999999999999999999999999999999999999999999999999
999999999999999999999999999999999999999999999999999
999999999999999999999999999999999999999999999999999
999999999999999999999999999999999999999999999999999
99999999999999999999.9999999.9999999999999999999999
9999999....999999999.9999999.99999.999999..99999999
9999999.999.99999999.9999999.99999999999.9999999999
9999999.9999.99...99.9....99....99.9999.99999999999
9999999.9999.9.999.9.9.999.9.999.9.9999....99999999
9999999.9999.9.....9.9.999.9.999.9.9999.999.9999999
9999999.9999.9.99999.9.999.9.999.9.9999.999.9999999
9999999.999.99.999.9.9.999.9.999.9.9999.999.9999999
9999999....9999...99.9....99.999.9.99999...99999999
9999999999999999999999.9999999999999999999999999999
9999999999999999999999.9999999999999999999999999999
999999999999999999999999999999999999999999999999999
999999999999999999999999999999999999999999999999999
999999999999999999999999999999999999999999999999999
999999999999999999999999999999999999999999999999999
999999999999999999999999999999999999999999999999999
999999999999999999999999999999999999999999999999999
999999999999999999999999999999999999999999999999999

解决方案 »

  1.   

    这个问题不是很难吧?QueryContextMenu()
    {根据MSDN的说明,必须从indexMenu位置开始插入菜单,并且菜单的标识符必须在idCmdFirst和idCmdLast之间int idCmd = idCmdFirst;InsertMenu(hMenu,indexMenu++,MF_STRING | MF_BYPOSITION,idCmd++,"Add To Zip...");
    InsertMenu(hMenu,indexMenu++,MF_STRING | MF_BYPOSITION,idCmd++,"Add To Zip1...");
    InsertMenu(hMenu,indexMenu++,MF_STRING | MF_BYPOSITION,idCmd++,"Add To Zip2...");return (idCmd - idCmdFirst); //返回值必须等于所增加的菜单数目.}
    --------------------------------------------------------------------------InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi)
    {
    根据MSDN的说明,如果你的DLL被资源管理起调用,那么HIWORD(lpcmi->lpVerb)等于0,这时候LOWORD(lpcmi->lpVerb)等于
    菜单标识符,实际上这个值等于所增加的顺序号,如0,1,2...if(!HIWORD(lpcmi->lpVerb))
    {
      int idCmd = LOWORD(lpcmi->lpVerb);
      
      switch(idCmd)
      {
        case 0:  // "Add To Zip... " 菜单项被调用
        case 1:  // "Add To Zip1... " 菜单项被调用
        case 2:  // "Add To Zip2... " 菜单项被调用
      }
    }
    }
      

  2.   

    呵呵,以前只做过单一菜单,没做过子菜单,看了你的问题,又特定试了一下,实际上也不难:
    -----------------------------------------------------------------------------------STDMETHODIMP TShellExt::QueryContextMenu( HMENU hMenu,UINT indexMenu,
      UINT idCmdFirst,UINT idCmdLast,
      UINT uFlags)
    {
     
      //根据MSDN的说明,必须从indexMenu位置开始插入菜单,并且菜单的标识符必须在idCmdFirst和idCmdLast之间
      int idCmd=idCmdFirst;
      AnsiString MenuItemStr="定制菜单2";  MENUITEMINFO mii;
      char *MenuStr = "定制菜单1";  HMENU hNewMenu = CreateMenu();  AppendMenu(hNewMenu,MF_STRING,idCmd++,"子菜单1");
      AppendMenu(hNewMenu,MF_STRING,idCmd++,"子菜单2");
      AppendMenu(hNewMenu,MF_STRING,idCmd++,"子菜单3");  mii.cbSize = sizeof(MENUITEMINFO);
      mii.fMask = MIIM_SUBMENU | MIIM_TYPE | MIIM_ID;
      mii.wID = idCmd++;
      mii.fType = MFT_STRING;
      mii.hSubMenu = hNewMenu;
      mii.dwTypeData = MenuStr;
      mii.cch = sizeof(MenuStr);  //定制菜单1 含有子菜单
      InsertMenuItem(hMenu,indexMenu++,true,&mii);  //独立的菜单项
      InsertMenu(hMenu,indexMenu++,MF_STRING | MF_BYPOSITION,idCmd++,MenuItemStr.c_str());  return HRESULT(idCmd-idCmdFirst); ////返回值必须等于所增加的菜单数目.}
    //---------------------------------------------------------------------------
    STDMETHODIMP TShellExt::InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi)
    {
      // 根据MSDN的说明,如果你的DLL被资源管理起调用,那么HIWORD(lpcmi->lpVerb)等于0,
      // 这时候LOWORD(lpcmi->lpVerb)等于菜单标识符,实际上这个值等于所增加的顺序号,
      // 如0,1,2...  int idCmd;  if(!HIWORD(lpcmi->lpVerb))
      {
        idCmd=LOWORD(lpcmi->lpVerb);    switch(idCmd)
        {
          case 0: //”子菜单1“被调用
          case 1: //“子菜单2”被调用
          case 2: //”子菜单3“被调用//      case 3: //“定制菜单1”的标识符,因为含有子菜单,所以该菜单项不可能被激活      case 4: //”定制菜单2“被调用
        }
      }
    }  
    //---------------------------------------------------------------------------
    //注意这一步不能少。STDMETHODIMP TShellExt::GetCommandString(UINT idCmd,
     UINT uFlags,
     UINT FAR *reserved,
     LPSTR pszName,
     UINT cchMax)
    {
    //  MessageBox(NULL,AnsiString("IdCmd="+IntToStr(idCmd)).c_str(),NULL,MB_OK | MB_APPLMODAL | MB_ICONWARNING);
      if(idCmd==0)
      {
        lstrcpy(pszName,"子菜单1");
      }
      else if(idCmd==1)
      {
        lstrcpy(pszName,"子菜单2");
      }
      else if(idCmd==2)
      {
        lstrcpy(pszName,"子菜单3");
      }  return NOERROR;
    }
    //---------------------------------------------------------------------------
      

  3.   

    在"delphibbs"上竟然不能回复,提示"无法保存数据",莫名其妙!!