ExtractIcon et DrawIcon dans VB.NET

Signaler
Messages postés
5
Date d'inscription
lundi 20 mai 2002
Statut
Membre
Dernière intervention
19 août 2002
-
Messages postés
34
Date d'inscription
jeudi 29 mars 2007
Statut
Membre
Dernière intervention
2 mai 2008
-
Bonjour,
Je cherche à utiliser les fonction de l'API suivantes dans VB .NET :
DrawIcon & ExtractIcon.
Malheureusement, je ne parviens pas à les fonctionner. QQn pourrait-il m'aider ? Merci.
A voir également:

10 réponses

Messages postés
49
Date d'inscription
jeudi 30 août 2001
Statut
Membre
Dernière intervention
28 avril 2010

A-tu pensé à changer les types de données de tes api ?
Pour .Net il faux utiliser Integer au lieu de Long.
Integer est devenu une variable 32bit et long 64bit.
Tes apis pour .net :
(J'ai rajouter GetWindowDC une autre petite finte sur le type de donnée...)
Public Declare Function ExtractIcon Lib "shell32.dll" Alias "ExtractIconA" (ByVal hInst As Integer, ByVal lpszExeFileName As String, ByVal nIconIndex As Integer) As Integer
Public Declare Function DrawIcon Lib "user32" Alias "DrawIcon" (ByVal hdc As Integer, ByVal x As Integer, ByVal y As Integer, ByVal hIcon As Integer) As Integer
Public Declare Function GetWindowDC Lib "user32" Alias "GetWindowDC" (ByVal hwnd As IntPtr) As Integer
Messages postés
5
Date d'inscription
lundi 20 mai 2002
Statut
Membre
Dernière intervention
19 août 2002

Bonjour,
Merci pour ton aide : ça avance. Mais j'ai encore qqs soucis :
- j'ai fait : L = ExtractIcon (Me.Handle.ToInt32, FileName,0) : c'est bon (bien que ça ne corresponde pas à la première icone du fichier, dans mon cas, il prend celle de 32*32).
Mais ça ne marche pas si le dernier paramètre est -1 (pour avoir le nombre d'icones) ou >0.
Comment je fais alors pour avoir la 3° icone d'un fichier ICO par exemple.

- si je fais : DrawIcon (PictureBox.Handle.ToInt32, 0, 0, L) : ça ne marche pas.
Par contre j'obtiens un résultat avec PictureBox7.Image = bitmap.FromHicon(new IntPtr(L)).
Bon, je fais avec, mais j'aimerais bien que DrawIcon marche.
Messages postés
5
Date d'inscription
lundi 20 mai 2002
Statut
Membre
Dernière intervention
19 août 2002

Bonjour,
Merci pour ton aide : ça avance. Mais j'ai encore qqs soucis :
- j'ai fait : L = ExtractIcon (Me.Handle.ToInt32, FileName,0) : c'est bon (bien que ça ne corresponde pas à la première icone du fichier, dans mon cas, il prend celle de 32*32).
Mais ça ne marche pas si le dernier paramètre est -1 (pour avoir le nombre d'icones) ou >0.
Comment je fais alors pour avoir la 3° icone d'un fichier ICO par exemple.

- si je fais : DrawIcon (PictureBox.Handle.ToInt32, 0, 0, L) : ça ne marche pas.
Par contre j'obtiens un résultat avec PictureBox7.Image = bitmap.FromHicon(new IntPtr(L)).
Bon, je fais avec, mais j'aimerais bien que DrawIcon marche.
Messages postés
49
Date d'inscription
jeudi 30 août 2001
Statut
Membre
Dernière intervention
28 avril 2010

A ma connaissance, un fichier ico peut contenir des icones de plusieurs format (16x16, 32x32, nb de couleur différentes) mais c'est toujours l'icone 0.
Essaye éventuellement avec ExtractIconEx.

Quand tu utilises : DrawIcon (PictureBox.Handle.ToInt32, 0, 0, L)
Tu attaques le handle du picturebox.
Si tu as fais du vb "Ancienne version" tu aura surement remarqué que les form ou picturesbox avais en plus de la propriété hWnd (=handle de la fenêtre) une propriété hDC (=handle du Device Context). C'est la dedans qu'on dessine.
J'ai pas encore trouvé de correspondance en .net c'est pourquoi j'utilise l'api GetDC ou GetWindowDC.
Sur une form, GetWindowDC représente le rectangle complet de la fenêtre titre et bordures compris et GetDC le rectancle client.
Les picturebox c'est la même chose sauf qu'il y a pas de titre.

Essaye ce code :
Déclaration API:
Public Declare Function ExtractIcon Lib "shell32.dll" Alias "ExtractIconA" (ByVal hInst As Integer, ByVal lpszExeFileName As String, ByVal nIconIndex As Integer) As Integer
Public Declare Function DrawIcon Lib "user32" Alias "DrawIcon" (ByVal hdc As Integer, ByVal x As Integer, ByVal y As Integer, ByVal hIcon As Integer) As Integer
Public Declare Function GetDC Lib "user32" Alias "GetDC" (ByVal hwnd As IntPtr) As Integer
Public Declare Function ReleaseDC Lib "user32" Alias "ReleaseDC" (ByVal hwnd As IntPtr, ByVal hdc As Integer) As Integer
Public Declare Function DestroyIcon Lib "user32" Alias "DestroyIcon" (ByVal hIcon As Integer) As Integer

A mettre dans Form_Click pour tester :
Dim hDC As Integer, hIcon As Integer
MsgBox("Le fichier shell32.dll contient " + Trim(ExtractIcon(0, "%WINDIR%\system32\shell32.dll", -1)) + " icones.")
hDC = GetDC(Me.Handle)
hIcon = ExtractIcon(0, "%WINDIR%\system32\shell32.dll", 5)
DrawIcon(hDC, 0, 0, hIcon)
ReleaseDC(Me.Handle, hDC)
DestroyIcon(hIcon)
Messages postés
5
Date d'inscription
lundi 20 mai 2002
Statut
Membre
Dernière intervention
19 août 2002

Bonjour,
OK, j'ai essayé. Merci.
Pour "DrawIcon" je n'ai toujours par réussi à afficher l'image, mais ce n'est pas grave puisque que j'ai un autre moyen.
Pour les fonctions ExtractIcon et ExtractIconEx, en fait je m'apperçois qu'elles retournent le nombre de ressources icônes d'un fichiers (ico, exe ou dll). Mais elle ne permettent pas de retrouver le nombre d'images par ressource. C'est pourquoi, par exemple, j'obtiens toujours 1 pour un fichier ico, même s'il y a plusieurs images dans cette ressource. J'ai bien une description des fichiers qui me permet de retrouver ce nombre sans difficulté, mais je ne sais pas comment extraire l'image n° n. J'ai essayé d'utiliser la classe icon de .NET, mais il lui manque un paramètre : on peut préciser la taille, mais pas la profondeur de couleur. Dommage. Sais tu comment récupérer une image particulière d'une ressourve icône ?
Merci.

PS. : si tu veux je peux t'envoyer la description des fichiers d'icones : c'est une version anglaise à moitié traduite en français.
Messages postés
49
Date d'inscription
jeudi 30 août 2001
Statut
Membre
Dernière intervention
28 avril 2010

Si tu dois absolument extraire ces icones depuis un soft, il y a peut être l'api LoadImage mais je dois admettre que je n'ai jamais testé. Dans MSDN, il y a toute une section traitant des ressources contenues dans les fichiers.

Si par contre tu dois extraire les ressources manuellement et les sauver dans un format désiré, il existe toutes sortes de soft tel Ax-Icon de Axialis que l'on trouve un peu partout sur internet.

Si tu t'en sort toujours pas et que t'es pas trop préssé je veux bien jeté un oeil sur ton problème (J'aime pas ne pas avoir la réponse :-)
Messages postés
5
Date d'inscription
lundi 20 mai 2002
Statut
Membre
Dernière intervention
19 août 2002

Bonjour,
En fait j'apprends à programmer sous VB et C# .NET. J'essaye comme exemple de développer un petit programme qui affiche les images d'un fichier d'icones. D'où mes questions. Donc je continue de chercher. Merci pour ton aide qui m'a bien dépanner jusque là.
Messages postés
71
Date d'inscription
samedi 17 août 2002
Statut
Membre
Dernière intervention
5 août 2012
1
Merci pour ton aide "mWaAtR " , car tu as pu aider pas mal de monde sur le traitement des api et icone, comme moi aussi.
Merci encore
Messages postés
34
Date d'inscription
jeudi 29 mars 2007
Statut
Membre
Dernière intervention
2 mai 2008

salut , merci pour ces informations sont trés utile mais bob s'il te plais si tu as trouvé la solution pour ton probléme n'hésité pas à l'afficher en tout cas ça sera pareil pour moi puisque je suis entrain derésoudre le même probléme .
Messages postés
34
Date d'inscription
jeudi 29 mars 2007
Statut
Membre
Dernière intervention
2 mai 2008

http://www.vbfrance.com/codes/EXTRACTION-ICONES_24316.aspx



c'est un lien qui présente la solution du probléme