ExtractIcon et DrawIcon dans VB.NET

cs_bob94 Messages postés 5 Date d'inscription lundi 20 mai 2002 Statut Membre Dernière intervention 19 août 2002 - 13 août 2002 à 17:32
sam_2_778 Messages postés 34 Date d'inscription jeudi 29 mars 2007 Statut Membre Dernière intervention 2 mai 2008 - 9 avril 2008 à 10:40
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.

10 réponses

mWaAtR Messages postés 49 Date d'inscription jeudi 30 août 2001 Statut Membre Dernière intervention 28 avril 2010
13 août 2002 à 22:53
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
0
cs_bob94 Messages postés 5 Date d'inscription lundi 20 mai 2002 Statut Membre Dernière intervention 19 août 2002
14 août 2002 à 15:11
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.
0
cs_bob94 Messages postés 5 Date d'inscription lundi 20 mai 2002 Statut Membre Dernière intervention 19 août 2002
14 août 2002 à 15:13
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.
0
mWaAtR Messages postés 49 Date d'inscription jeudi 30 août 2001 Statut Membre Dernière intervention 28 avril 2010
14 août 2002 à 16:37
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)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_bob94 Messages postés 5 Date d'inscription lundi 20 mai 2002 Statut Membre Dernière intervention 19 août 2002
19 août 2002 à 10:44
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.
0
mWaAtR Messages postés 49 Date d'inscription jeudi 30 août 2001 Statut Membre Dernière intervention 28 avril 2010
19 août 2002 à 13:48
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 :-)
0
cs_bob94 Messages postés 5 Date d'inscription lundi 20 mai 2002 Statut Membre Dernière intervention 19 août 2002
19 août 2002 à 19:06
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à.
0
RJLFRANCE Messages postés 71 Date d'inscription samedi 17 août 2002 Statut Membre Dernière intervention 5 août 2012 1
20 janv. 2004 à 13:26
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
0
sam_2_778 Messages postés 34 Date d'inscription jeudi 29 mars 2007 Statut Membre Dernière intervention 2 mai 2008
9 avril 2008 à 10:23
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 .
0
sam_2_778 Messages postés 34 Date d'inscription jeudi 29 mars 2007 Statut Membre Dernière intervention 2 mai 2008
9 avril 2008 à 10:40
http://www.vbfrance.com/codes/EXTRACTION-ICONES_24316.aspx



c'est un lien qui présente la solution du probléme
0
Rejoignez-nous