Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

AJOUTER DES IMAGES DANS UN MENU


Information sur la source

Catégorie :API Niveau : Expert Date de création : 25/06/2003 Date de mise à jour : 26/06/2003 09:45:29 Vu / téléchargé: 7 124 / 2 248

Note :
6,33 / 10 - par 6 personnes
6,33 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (24)
Ajouter un commentaire et/ou une note

Description

Ce code permet d'ajouter des images (BITMAP, attention, les icones ne sont pas supportées) dans un menu d'application... Il suffit de passer en paramètre le libellé d'item de menu à modifier, ainsi que l'image à afficher. Celle ci peut être venir d'une PictureBox ou d'une ImageList. Grosse amélioration par rapport aux codes que l'on peut trouver sur le net : sachant que la dimensions des images de menu sont dynamiques (en fonction de la résolution), ce code redimensionne automatiquement le bitmap avant de la plaquer sur le menu. Vous avez donc possibilité d'utiliser directement des bitmaps 16x16, 32x32 voire plus, ils seront pris en charge automatiquement.
A la demande générale, g tout remis dans un ZIP  
 

Conclusion

Attention toutefois lorsque vous passez des bitmap bcp + grands que la dimensions des images de menu : le redimensionnement risque de pas être très très joli  
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Commentaires et avis

signaler à un administrateur
Commentaire de laestrella le 25/06/2003 15:56:21

T'es un fou toi de laisser ça sans fichier ZIP lol.
C'est bien joli mais je te conseil de le mettre dans un Zip. ça sera plus facile pour tout le monde.

signaler à un administrateur
Commentaire de max12 le 25/06/2003 16:41:15 administrateur CS

C'est vrai qu'un zip serais fortement interressant pour les débutants :)

signaler à un administrateur
Commentaire de LogOff le 25/06/2003 16:59:46

Ce code a l'air super (et surtout simple à utiliser !), mais la ligne:
Dim CurBitmap As bitmap provoque une erreur :
type défini par l'utilisateur non défini

Quelqu'un pourrait-il résoudre le pb ?
Merci d'avance

signaler à un administrateur
Commentaire de Urgo le 25/06/2003 17:30:47

Un zip pour les flémards comme moi :)

signaler à un administrateur
Commentaire de psycho le 25/06/2003 19:55:25

g rajouté ca et ca marche...
Private Type BITMAP '14 bytes
        bmType As Long
        bmWidth As Long
        bmHeight As Long
        bmWidthBytes As Long
        bmPlanes As Integer
        bmBitsPixel As Integer
        bmBits As Long
End Type
(issu de la visionneuse d api.)
++
psycho

signaler à un administrateur
Commentaire de jmluc le 26/06/2003 08:35:08

J'avais vu bien plus simple y'a qques temps pour un développement :
Dans un module :
Public Declare Function GetMenu Lib "user32" (ByVal hwnd As Long) As Long
Public Declare Function SetMenuItemBitmaps Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long, ByVal hBitmapUnchecked As Long, ByVal hBitmapChecked As Long) As Long
'
Public Const M_BITMAP = 4&

Dans ta form :

Private Sub Form_Load()
Dim hMenu As Long
Dim hSousMenu As Long
Dim ID As Long
'
'*** REM : le premier sousmenu a pour index 2, le suivant 3 etc...

hMenu = GetMenu(Me.hwnd)
'*** Premier sous-menu <ouvrir>
'
ID = 2
SetMenuItemBitmaps hMenu, ID, M_BITMAP, PicOuvrir.Picture, PicOuvrir.Picture
'*** Deuxième Sous-Menu <Enregistrer>
'
ID = 3
SetMenuItemBitmaps hMenu, ID, M_BITMAP, PicEnregistrer.Picture, PicEnregistrer.Picture

ID = 5
SetMenuItemBitmaps hMenu, ID, M_BITMAP, PicStop.Picture, PicStop.Picture



End Sub

Private Sub mnuQuitter_Click()
End
End Sub

Cela suppose que tes images sont sur la form en non visible...
Mais ça marche bien
jmluc@jmlucienvb.org

signaler à un administrateur
Commentaire de EBArtSoft le 26/06/2003 09:15:08 administrateur CS

C'est vrais que la methode de jmluc est typique et bien plus simple cela dit pour utiliser les icones on peut utiliser ta methode avec l'API drawicon au lieu de stretchblt !

j'y comprend rien au "niveau" mais niveau le niveau 3 ne me semble
pas etre adapté...

mauvais point je ne sait pas si tu as testé ta source avant de la balancer compte tenu des oublis comme celui de liberer la memoire du bitmap en fin de routine :

hStretchBitmap = CreateCompatibleBitmap(...)
...
DeleteObject hStretchBitmap

je met 5/10

Applique toi, continue et B@nne prog

signaler à un administrateur
Commentaire de Matesys le 26/06/2003 09:18:39

Le code de jmluc marche effectivement, ct la 1ère version que j'avais écrite... Seulement, ce code oblige à avoir des images préformattées ayant une taille valide, c-a-d correspondant à la taille définie par le système avec la résolution écran en cours... Ici, je peux envoyer des images en 48x48 qui seront redimensionnées avec la taille ad hoc... Pour le type BITMAP, g mis à jour le code

signaler à un administrateur
Commentaire de jmluc le 26/06/2003 09:29:54

Je vais testé ta nouvelle méthode...
En attendant ton travail est bien...8/10
jmluc

signaler à un administrateur
Commentaire de laestrella le 26/06/2003 09:57:20

Merci pour le zip et c'est mieux d'en mettre un à chaque fois

signaler à un administrateur
Commentaire de Jujufouq le 27/06/2003 00:05:46

Intéressant, mérite qu'on se penche dessus. Bonne note.

signaler à un administrateur
Commentaire de KeepCool37 le 26/03/2004 18:13:38

ça ne veut pas marcher !!!!

A la base, il manquait :

Public Const SRCCOPY = &HCC0020 ' (DWORD) dest = source

Pi j'vois tjrs pas ma zimage dans le menu !

signaler à un administrateur
Commentaire de benzinafouad le 12/04/2004 19:43:56

Pourquoi ne pas faire un exemple dans le zip?!!!!!!!!!!!! c bizzar

signaler à un administrateur
Commentaire de Egalon le 25/08/2004 15:42:25

C'est clair qu'on y voit rien!
Un exemple serait le bienvenu.
Merci

signaler à un administrateur
Commentaire de tmeg le 02/09/2004 17:13:48

oui un exemple et plus de commentaire serais le bienvenue mais sinon nikel

signaler à un administrateur
Commentaire de scoob79 le 03/11/2004 22:32:44

cela ne marche pas chez peut-être que je ne sais pas le faire fonctionner j'attend le zip avec demo.

signaler à un administrateur
Commentaire de KeepCool37 le 12/11/2004 13:54:47

Cette source ne fonctionne pas sur ma machine XP.
J'ai essayé d'essayer de comprendre et il semble que cela vienne d'un problème de compatibilité avec l'ImageList.
Il faut prendre l'ImageList issue de la librairie de composants COMCTL32.ocx dans Microsoft Windows Common Controls 5.0 (SP2) (voir le menu Projet/Composant... dans l'ide VB6) et non celle de MSCOMCTL.ocx dans Microsoft Windows Common Controls 6.0 (SP6)
En redéfinissant les icons ça marche du tonner !!!!!!!

signaler à un administrateur
Commentaire de zeunz le 23/01/2005 22:52:00

slt  j'ai essaye la methede d'ARTSoft, et ca ne marche ke pr les fichiers image avec une largeur et hauteur de 12 cm chacun. ms si c'est plus grand, le menu me coupe l'image....

signaler à un administrateur
Commentaire de Rifton007 le 31/01/2005 18:29:21

Comment sa fonctionne j'ai rien compris.

signaler à un administrateur
Commentaire de pekch le 02/07/2006 01:25:37

arg j'ai plein d'erreur (WMain.hwnd, y connait pas et moi non plus, et ya le truc avec sccopy...)
bon bref de toute facon j'en ai pas vraiment besoin, mais bon ca aurait été un plus ;)

signaler à un administrateur
Commentaire de lionyz le 06/03/2009 00:32:09

Au 1er essai 2 problèmes

1 - L'instruction suivante provoque une erreur
    AddIconToMenu mnuSites(0), ImgList1(1)

    l'argument pour les menus est accepté mais pour les images venant d'une ImageList
    il est refusé (Vb ne gère pas ....)
    un exemple serait le bienvenu

2 - Dans l'instruction 'hMenu = GetMenu(MainW.hwnd)' la variable MainW n'est pas définie

Merci de votre aide

signaler à un administrateur
Commentaire de lionyz le 06/03/2009 00:45:20

Au 2ème essai un 3ème bug

la variable SRCCOPY n'est pas définie

Merci de votre aide

signaler à un administrateur
Commentaire de lionyz le 06/03/2009 23:46:35

Au 3ème essai et après quelques recherches voilà ou j'en suis

Le code à mettre dans la form sur laquelle se trouve les menus (Name ->  Form1 par exemple)
peut s'écrire comme suit

AddIconToMenu "Ouvrir", Img1

(Img1 est une Picture sur Form1 non visible)

Dans le module

hMenu = GetMenu(MainW.hwnd) devient hMenu = GetMenu(Form1.hwnd)

et ajouter comme écrit plus haut

Public Const SRCCOPY = &HCC0020 ' (DWORD) dest = source

Ayant fait ces modifications je clique sur 'Exécuter'

puis je clique sur le menu Ad Hoc et surprise le menu ne fait plus apparaitre les sous-menus
il est bloqué ?? donc pas de sous-menus et pas d'image !!

Quelqu'un a t il peut obtenir une image et si oui comment ?

Merci d'avance






signaler à un administrateur
Commentaire de lionyz le 07/03/2009 11:30:03

Au 4ème essai et après quelques modifications j'ai réussi à faire fonctionner ce programme

J'ai supprimé le redimensionnement pas vraiment indispensable.
ça marche sauf pour les popupmenus; quand on décoche la case 'Visible' dans le créateur de menus les images
n'apparaissent plus dans les sou-menus
Si quelqu'un à une idée sur le sujet, merci de nous la faire partager.

Exemple de menu dans une Form qui contient les menus sous-menus et les images en non visible

Fichiers
Ouvrir
Enregistrer
Imprimer

Dans la Form

Private Sub Form_Load()

...........

'Ajouter Icons dans menus
Dim hMenu As Long
hMenu = GetMenu(Me.hWnd)

AddIconToMenu "Ouvrir" , PicOuvrir.Picture, hMenu
AddIconToMenu "Enregistrer" , PicEnregistrer.Picture, hMenu
AddIconToMenu "Imprimer" , PicImprimer.Picture, hMenu

............

End Sub

Dans un module


Option Explicit

'******************************* TYPES APIs ************************************
Private Type MENUITEMINFO
    cbSize As Long
    fMask As Long
    fType As Long
    fState As Long
    wid As Long
    hSubMenu As Long
    hbmpChecked As Long
    hbmpUnchecked As Long
    dwItemData As Long
    dwTypeData As String
    cch As Long
End Type


'**************************** CONSTANTES APIs **********************************
Public Const SM_CXMENUCHECK = 71
Public Const SM_CYMENUCHECK = 72

Private Const MENU_IDENTIFIER As Long = &H1
Private Const MIIM_TYPE = &H10
Private Const MIIM_SUBMENU = &H4
Private Const MIIM_STATE As Long = &H1
Private Const MIIM_ID As Long = &H2
Private Const MIIM_CHECKMARKS As Long = &H8
Private Const MIIM_DATA As Long = &H20
Private Const MF_POPUP = &H10
Private Const MF_BYCOMMAND = &H0&
Private Const MF_BYPOSITION = &H400
Private Const MF_SEPARATOR = &H800
Private Const MF_BITMAP = &H4&
Private Const MFT_STRING As Long = &H0
Private Const MFT_BITMAP = MF_BITMAP
Private Const MFT_RADIOCHECK = &H200&


'********************************  APIs ****************************************

Public Declare Function GetMenu Lib "User32" (ByVal hWnd As Long) As Long
Private Declare Function GetSubMenu Lib "User32" (ByVal hMenu As Long, ByVal nPos As Long) As Long
Private Declare Function GetMenuCheckMarkDimensions Lib "User32" () As Long
Private Declare Function GetMenuItemCount Lib "User32" (ByVal hMenu As Long) As Long
Private Declare Function GetMenuItemID Lib "User32" (ByVal hMenu As Long, ByVal nPos As Long) As Long
Private Declare Function GetMenuItemInfo Lib "User32" Alias "GetMenuItemInfoA" (ByVal hMenu As Long, ByVal uItem As Long, ByVal ByPos As Boolean, lpmii As MENUITEMINFO) As Long
Private Declare Function SetMenuItemInfo Lib "User32" Alias "SetMenuItemInfoA" (ByVal hMenu As Long, ByVal uItem As Long, ByVal ByPos As Long, lpcMenuItemInfo As MENUITEMINFO) As Long
Private Declare Function ModifyMenuPic Lib "User32" Alias "ModifyMenuA" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long, ByVal wIDNewItem As Long, ByVal lpString As Long) As Long
Public Declare Function SetMenuItemBitmaps Lib "User32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long, ByVal hBitmapUnchecked As Long, ByVal hBitmapChecked As Long) As Long


'****************************** FONCTION ****************************************
Public Sub AddIconToMenu(ByVal pMenuLabel As String, ByVal pMenuPicture As Long, hMenu As Long)
    Dim ret As Long, hSubMenu As Long
    Dim MenuID As Long, CurMenu As MENUITEMINFO
    Dim NbMenus As Long, NbSubMenus As Long
    Dim i As Long, j As Long
    
    'Recherche de l'ID de l'item de menu dont le libellé est passé en paramètre
    NbMenus = GetMenuItemCount(hMenu)
    For i = 0 To NbMenus
        hSubMenu = GetSubMenu(hMenu, i)
        NbSubMenus = GetMenuItemCount(hSubMenu)
        For j = 0 To NbSubMenus
            With CurMenu
                .cbSize = Len(CurMenu)
                .fMask = MIIM_TYPE
                .fType = MFT_STRING
                .dwTypeData = vbNullString
                .cch = Len(.dwTypeData)
                
                 ret = GetMenuItemInfo(hSubMenu, j, MENU_IDENTIFIER, CurMenu)
                
                .dwTypeData = Space$(.cch + 1)
                .cch = Len(.dwTypeData)
                
                ret = GetMenuItemInfo(hSubMenu, j, MENU_IDENTIFIER, CurMenu)
                If Left$(Trim$(.dwTypeData), Len(pMenuLabel)) = pMenuLabel Then MenuID = GetMenuItemID(hSubMenu, j): Exit For
                MenuID = 0
            End With
        Next
        If MenuID <> 0 Then Exit For
    Next
    
    If MenuID = 0 Then Exit Sub 'Elément de menu non trouvé
    
    'Affection au menu
    SetMenuItemBitmaps hSubMenu, MenuID, MF_BYCOMMAND, pMenuPicture, pMenuPicture

End Sub

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 4,898 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.