IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants VCL Delphi Discussion :

ContextMenu de l'explorer: Problème de sous menu


Sujet :

Composants VCL Delphi

  1. #1
    Membre régulier Avatar de Ingham
    Profil pro
    Inscrit en
    Août 2002
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 156
    Points : 75
    Points
    75
    Par défaut ContextMenu de l'explorer: Problème de sous menu
    Bonsoir

    Voilà, mon problème est simple, j'ai créé une DLL pour ajouter mes items dans le menu contextuel de l'explorer (avec winzip par exemple)...
    Mais je n'arrive pas à créer de Sous-Menu...

    Voici le code de la fonction QueryContextMenu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function TShellFTPShellExtEx.QueryContextMenu(Menu: HMENU; indexMenu, idCmdFirst, idCmdLast, uFlags: UINT): HResult; 
    begin 
      if (uFlags and CMF_DEFAULTONLY)=0 then 
      begin
     
        InsertMenu(Menu, IndexMenu, MF_POPUP or MF_STRING or MF_BYPOSITION, idCmdFirst, 'Test de sous menu');
        AppendMenu(idCmdFirst, MF_STRING, idCmdFirst + 1, 'Item 1');
        result:= 1;
     
      end
      else 
        result:= NOERROR;
    end;
    Mais rien à faire, il m'affiche bien "Test de sous menu" mais sans la petite fleche noire à droite, et donc sans sous menu

    J'espère que vous pourrez m'aider

    Ingham

  2. #2
    Membre chevronné
    Avatar de Pierre Castelain
    Inscrit en
    Avril 2002
    Messages
    523
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 523
    Points : 1 943
    Points
    1 943
    Par défaut
    Je me rappelle avoir cherché longtemps aussi. En fait la fonction InsertMenu ne créé par de menu mais un item de menu. Il te faut donc créer un menu et l'ajouter dans le menu contextuel. Cela donne à peu près ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    var
      hParent: HMenu;
      ndx, cmd: UINT;
    begin
        hParent:= CreateMenu;
        InsertMenu(Menu, IndexMenu, MF_POPUP or MF_BYPOSITION, UINT(hParent), 'Mon sous-menu');
        Inc(IndexMenu);
        ndx:= IndexMenu;
        cmd:= idCmdFirst;
        for i:=0 to 9 do
        begin
          InsertMenu(hParent, ndx, MF_STRING or MF_BYPOSITION, cmd,
            PChar(IntToStr(i));
          Inc(ndx);
          Inc(cmd);
        end;
    end;

  3. #3
    Membre régulier Avatar de Ingham
    Profil pro
    Inscrit en
    Août 2002
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 156
    Points : 75
    Points
    75
    Par défaut
    Merci beaucoup
    En effet c'était pas évident

  4. #4
    Membre régulier Avatar de Ingham
    Profil pro
    Inscrit en
    Août 2002
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 156
    Points : 75
    Points
    75
    Par défaut
    J'ai parlé trop vite, j'ai encore 1 ou 2 questions ...

    La première, ca serait (dans la fonction InvokeCommand), comment savoir sur quel item du sous menu l'utilisateur à cliqué, je suppose que ca doit être en récupérant un paramètre du "lpici"...

    Parceque je comprends pas trop pourquoi, quand je clic sur le premier Item de mon sous menu ça m'excute mon InvokeCommand, mais quand je clic sur le deuxième, le troisième, le quatrième etc ... Ca me lance winzip

    La deuxième question serait comment affecter une icône aux items que j'ajoute, j'ai essayé avec SetMenuItemBitmaps, mais ça me fait planter l'explorer Je dois sûrement mal l'utiliser

  5. #5
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    pour la premiére question ( la première partie du code est redondante avec celui de pierre castelain ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
     
     
    function TContextTools.QueryContextMenu(Menu: HMENU; indexMenu, idCmdFirst,
           idCmdLast, uFlags: UINT): HResult;
    Const
     Caption:String='Modifier l''extension';
     
    var
       Command_ID,
       hSub_Menu : HMenu;
       MenuInfo : TMenuItemInfo;
    begin
      Result:= 0;
      if ((uFlags and $0000000F) = CMF_NORMAL) or
         ((uFlags and CMF_EXPLORE) <> 0) then
        begin
          MenuIndex1 := indexMenu;     // index du sous menu
          Command_ID := idCmdFirst;
     
          MenuInfo.cbSize := SizeOf(MenuInfo);
          hSub_Menu := CreateMenu;
     
          Inc(Command_ID);
          MenuIndex2 := MenuIndex1+1;  // index de l'entrée du sous menu
          InsertMenu(hSub_Menu,MenuIndex2,MF_BYPOSITION or MF_STRING,Command_ID,'Copier et renommer en 001');
     
          Inc(Command_ID);
          MenuIndex3 := MenuIndex2+1;
          InsertMenu(hSub_Menu,MenuIndex3,MF_BYPOSITION or MF_STRING,Command_ID,'Renommer en 001');
     
          {
          si d'autre entrées :
           Inc(Command_ID);
           MenuIndex4 := MenuIndex3+1;
           InsertMenu(hSub_Menu,MenuIndex4,MF_BYPOSITION or MF_STRING,Command_ID,'Third Memu Itrm');
     
          }
     
          With MenuInfo do
           begin
            fMask := MIIM_ID or MIIM_SUBMENU or MIIM_TYPE;
            fType := MFT_STRING;
            fState := 0;
            dwTypeData :=Pchar(Caption);
            cch := Length(Caption);  //  20 :longueur de chaine;
            hSubMenu := hSub_Menu;
            wID := idCmdFirst;
            hbmpChecked := 0;
            hbmpUnchecked := 0;
           end;
          InsertMenuItem(Menu,MenuIndex1,True,MenuInfo);
          Result := 3{ 1 sous-Menu +2 entrées};
     
        end;
    end;
     
     
    function TContextTools.InvokeCommand(var lpici: TCMInvokeCommandInfo): HResult;
    var
      lResult       : Byte;
      FileName,
      MessageString : String;
      lMenuIndex    : Integer;
     
    begin
      Result := E_FAIL;
      lResult:=lSuccess;
      MessageString:='';
      lMenuIndex := Integer(lpici.lpVerb);
     
        // Make sure we are not being called by an application
      if HiWord(lMenuIndex) <> 0 then
      begin
        Exit;
      end;
     
      Result := NOERROR;
      // Make sure we aren't being passed an invalid argument number
      //   and
      // Execute the command specified by lpici.lpVerb
      // by invoking the Delphi command line compiler.
     
      Filename:= string(FFileName);
      if LoWord(lMenuIndex) = MenuIndex2
       then
        begin
         lResult:=Operation(lpici.hWnd,ID_COPYBAK,Filename);
         if lResult<>lSUCCESS
          then Result := E_FAIL;
        end
       else
          if LoWord(lMenuIndex) = MenuIndex3
           then
            begin
             Result:=Operation(lpici.hWnd,ID_BAKNAME,Filename);
             if lResult<>lSUCCESS
              then Result := E_FAIL;
            end
           else
            begin
             Result := E_INVALIDARG;
             Exit;
            end;
     
      If lResult= lNOFILE
       then MessageString:='Fichier introuvable.';
     
      If lResult= lREAD_DIRECTORY_ERROR
       then MessageString:='Erreur de lecture du répertoire.';
     
      if MessageString<>''
       then MessageBox(lpici.hWnd, Pchar(MessageString),'Erreur',MB_ICONERROR or MB_OK)
    end;
    pour la 2éme :
    A+
    Laurent Dardenne

  6. #6
    Membre régulier Avatar de Ingham
    Profil pro
    Inscrit en
    Août 2002
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 156
    Points : 75
    Points
    75
    Par défaut
    Merci beaucoup ça marche maintenant

    Pour la deuxième question, c'était simplement pour savoir comment ajouter une petite icône à côté de mes items dans le menu, comme winzip par exemple

  7. #7
    Membre chevronné
    Avatar de Pierre Castelain
    Inscrit en
    Avril 2002
    Messages
    523
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 523
    Points : 1 943
    Points
    1 943
    Par défaut
    Pour ajouter une image au sous-menu, juste après le InsertMenu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        SetMenuItemBitmaps(Menu, IndexMenu, MF_BITMAP or MF_BYPOSITION, bmp.Handle, bmp.Handle);

  8. #8
    Membre régulier Avatar de Ingham
    Profil pro
    Inscrit en
    Août 2002
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 156
    Points : 75
    Points
    75
    Par défaut
    Ben vi je le savais mais justement ça fait planter mon explorer dès que je fais un clic droit sur un fichier

    J'ai sûrement du faire une erreur, voici les codes que j'ai essayé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
          hLib:= LoadLibrary('C:\Windows\system32\shell32.dll');
          if hlib <> 0 then
          begin
            hIcon:= LoadImage(hLib, PChar(1), IMAGE_ICON, 16, 16, 0);
            if hicon <> 0 then
              SetMenuItemBitmaps(Menu, IndexMenu, MF_BITMAP or MF_BYPOSITION, hIcon, hIcon);
            FreeLibrary(hLib);
          end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
          lBitmap:= TBitmap.Create;
          lBitmap.LoadFromFile ('C:\monicone.ico');
          SetMenuItemBitmaps(Menu, IndexMenu, MF_BITMAP or MF_BYPOSITION, lBitmap.Handle, lBitmap.Handle);
    Avec les deux, l'explorer plante :/
    En tout cas merci à vous deux pour l'aide, vos réponses sont vraiment claires et complètes, c'est super

  9. #9
    Membre chevronné
    Avatar de Pierre Castelain
    Inscrit en
    Avril 2002
    Messages
    523
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 523
    Points : 1 943
    Points
    1 943
    Par défaut
    Tu devrais essayer avec des bitmaps et non des icones...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème Débutant: Sous-menu et Context-menu
    Par azaghal dans le forum Composants graphiques
    Réponses: 3
    Dernier message: 04/04/2011, 19h05
  2. Problème de sous menu blanc
    Par AcidLines dans le forum ASP.NET
    Réponses: 2
    Dernier message: 28/12/2010, 16h40
  3. [XHTML 1.1] Problème affichage sous menu avec IE
    Par Icedarts dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 14/05/2009, 14h53
  4. Problème de sous menu dynamique [GTK+/C]
    Par DevMg dans le forum GTK+ avec C & C++
    Réponses: 5
    Dernier message: 28/09/2008, 20h00
  5. [PHP-JS] Problème aléatoire sous Internet Explorer
    Par jibe74 dans le forum Langage
    Réponses: 13
    Dernier message: 13/02/2007, 17h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo