BackgroundImage dans une ListView

Signaler
Messages postés
63
Date d'inscription
vendredi 6 décembre 2002
Statut
Membre
Dernière intervention
16 janvier 2009
-
 yohan49 -
Salut !!

Alors c simple, je souhaiterai savoir comment faire pour rajouter une image de fonc à une listView....

Quelqu'un pourrait m'éclairer ??

Frederyck
A voir également:

22 réponses

Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
56
Salut,

On peut mettre une couleur, mais pas une image!
Donc pour répondre à la question : pas possible, dumoins avec le control de base...
Messages postés
63
Date d'inscription
vendredi 6 décembre 2002
Statut
Membre
Dernière intervention
16 janvier 2009
1
Oui effectivement ce n'est pas prévu dans le control de base.
Néanmoins j'ai lu sur le net des témoignages de personnes ayant pu passer outre en utilisant les APIs Windows.
Plus particulièrement, je crois la fonction setMessage avec le paramètre LV_ITEM ou quelque chose comme ca.
J'aurai donc souhaité savoir si quelqu'un savait précisemment comment utiliser cette fonction de l'API....

merci.

Frederyck
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
93
private struct LVBKIMAGE
{
public uint ulFlags;
public IntPtr hbm;
[MarshalAs(UnmanagedType.LPTStr)]
public string pszImage;
public uint cchImageMax;
public int xOffsetPercent;
public int yOffsetPercent;
}

private const uint LVBKIF_SOURCE_URL = 0x00000002;
private const uint LVM_SETBKIMAGE = 0x1000 + 138;

[DllImport("user32.dll", EntryPoint="SendMessage")]
private static extern int SendMessageSetBkImage(
IntPtr hWndControl,
uint messID,
uint wParam,
ref LVBKIMAGE lParam
);  

private void Form1_Load(object sender, System.EventArgs e)
{
LVBKIMAGE bkImg = new LVBKIMAGE();
bkImg.ulFlags = LVBKIF_SOURCE_URL;
bkImg.pszImage = @"C:\coq.jpg";

// affichage centré
bkImg.xOffsetPercent = 50;
bkImg.yOffsetPercent = 50;

SendMessageSetBkImage(listView1.Handle, LVM_SETBKIMAGE, 0, ref bkImg);
}


Cocoricoooooooo !!!!
Messages postés
63
Date d'inscription
vendredi 6 décembre 2002
Statut
Membre
Dernière intervention
16 janvier 2009
1
Merci beaucoup coq !, c'est exactement ce que je cherchais...ca me permettra de comprendre l'utilisation des APIs en C# (mon problème est surtt au niveau des type, des structures etc...)

Je m'en vais de suite tester ce bout de code.

Frederyck
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
56
Pt'ain c'est du chinois ou du C# ce morceau de code?
'achement compliqué non? :big)
Messages postés
63
Date d'inscription
vendredi 6 décembre 2002
Statut
Membre
Dernière intervention
16 janvier 2009
1
Non du tout c de l'utilisation des APIs Windows, et franchement c'est vraiment bon à connaitre, parce qu'elles permettent pas mal de chose comme entre autre, et c'était le cas ici ajouter une image de fond dans une listview ;)

Frederyck
Messages postés
63
Date d'inscription
vendredi 6 décembre 2002
Statut
Membre
Dernière intervention
16 janvier 2009
1
Ok ben je viens de tester le petit bout de code que coq a posté et ca marche nikel ;)

J'aurai une autre question...
en fait 2 autres questions:
1) Comment je peus faire pour forcer la couleur de fond de mon texte à transparent. J'ai essayé de le faire dans la fenêtre de propriété de Visual Studio, et ca ne me donne rien, y'a toujours un rectangle blanc qui mange sur mon image de fonc.
J'ai aussi essayé par les APIs voici mon bout de code

[DllImport("user32.dll", EntryPoint="SendMessage")]
private static extern int SendMessageLong(
IntPtr hWndControl,
uint messID,
uint wParam,
long lParam
);

private const uint LVM_SETTEXTBKCOLOR = (LVM_FIRST + 38);
private const uint CLR_NONE = 0xFFFFFFFF;
SendMessageLong(this._listView.Handle, LVM_SETTEXTBKCOLOR, 0, CLR_NONE);

juste après l'appel à la méthode sendMessageBackground qui ajoute une image de fond.
Mais ca ne me donne rien, j'ai bien mon image de fond, mais la couleur de fond de mes items est blanche.

2) De plus comment puis je faire pour redimensionner l'image de fonc en fonction de la taille de la fenêtre.
J'ai une image de fond qui doit toujours se trouver en bas à droite
bkImg.xOffsetPercent = 100;
bkImg.yOffsetPercent = 100;

Mais si je rétrécie ma fenêtre l'image reste à la même taille ets est rognée.

Merci de me guider si vous avez une idée

Frederyck
Messages postés
507
Date d'inscription
jeudi 28 mars 2002
Statut
Membre
Dernière intervention
13 mai 2009
1
C'est ce que j'appelle "le miracle des API"...
Tu trouves un truc vachement bien, et 30 mn plus tard, en testant, tu t'aperçois que tu n'es qu'au quart du chemin, et que ce qu'il te reste à faire est encore plus compliqué...
J'adore.

Perso, je préfère télécharger des composants que les autres ont fait, j'ai vraiment pas la patience de chercher des heures pour réussir à rafraichir ou ajuster correctement...

<-- St@iLeR -->
Messages postés
63
Date d'inscription
vendredi 6 décembre 2002
Statut
Membre
Dernière intervention
16 janvier 2009
1
C'est clair que je me rend compte que g encore un peu de chemin afin d'arriver à composant listview gérant les images de fond, seulement je préfère créer mes composants moi même.
Ca permet tellement de choses:
- entrainement au codage en utilisant un tas de technique
- connaitre le composant qu'on utilise, et être sur qu'il correspond à ce qu'on veut, car j'ai téléchargé un composant ListView qui gérait déjà l'image de fonc...l'ennui c'est qu'il gérait aussi d'autres choses....et pour moi beaucoup trop de choses ce qui fait que ca l erendait long, et puis l'esthétisme n'était pas forcément au rendez-vous...c'est pourquoi je souhaite reprendre la listView de microsoft, en lui rajoutant juste une image de fond, car je trouve ca plus joilie :)

Frederyck
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
93
2) a ma connaissance impossible, à moins d'avoir plusieurs images de tailles differentes sur le disque et de les choisir suivant la taille du controle

1)
Application.EnableVisualStyles();
Application.DoEvents();
Application.Run(new Form1());


Cocoricoooooooo !!!!
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
93
ah oui, ça implique que cela ne marchera que sur du XP et supérieurs : comctrl32 v6

Cocoricoooooooo !!!!
Messages postés
63
Date d'inscription
vendredi 6 décembre 2002
Statut
Membre
Dernière intervention
16 janvier 2009
1
Merci Coq d'avoir répondu si vite :big)

Bon ben je vais essayer de cersuer la question pour la redimension de l'image.

Concernant ApplicationEnableVisualStyle(), je n'ai pas eu de différence lorsque je l'ai rajouté. Et en me renseignant un peu sur le site de microsoft j'ai vu une histoire de manifest qu'il fallait créer (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/userex/cookbook.asp)

J'avoue ne pas avoir tout saisi.....tout cela est il vraiment necessaire pour que la couleur d'arrière plan des items soit tranparente ??

Frederyck
Messages postés
63
Date d'inscription
vendredi 6 décembre 2002
Statut
Membre
Dernière intervention
16 janvier 2009
1
ah je viens de voir ton poste, ca répond donc à ce que j'avais lu sur le site de microsoft

Bon je constate donc que ca ne m'arrenge vraiment pas, j'aurai voulu que mon code marche sur toutes les plateformes...

En gros pour que t'es une idée, sous XP quand on définit un répertoire par exemple comme étant un album photo, il y a en image de fonc (en mode détails) un petit album qui reste toujours dans le coin inférieu gauche quoiqu'on fasse, et toujours de la même taille.
Et bien je voudrais faire exactement la même chose...bon et si vraiment c tordu, au moins pouvoir utiliser cette liste....

Si t'as une idée....

Merci. ;)

Frederyck
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
93
comme d'apres ce que j'ai compris cette histoire de couleur transparente n'est valable que pour la version 6 des controles communs, qui contrairement aux versions precedentes n'est pas redistribuable, ça ne fonctionnera que sur une version de win la possedant, càd XP et 2003
donc sur les versions antérieures de win ton image sera toujours masquée par les items

ce que tu peux faire à la rigueur c'est placer ton code d'affectation de l'image de fond dans qqch de ce genre là :
if ( Environment.OSVersion.Version >= new Version("5.1"))
{
...
}

afin de ne faire ces actions que pour XP et supérieurs

Cocoricoooooooo !!!!
Messages postés
63
Date d'inscription
vendredi 6 décembre 2002
Statut
Membre
Dernière intervention
16 janvier 2009
1
Okay !!
G compris le truc :) , ben j vais faire ca alors.
Ok ben c cool, merci bcp poiur ton aide. J suis parvenu à faire ce que je voulais :big) ... Encore qu'il me reste l'image à essayer de déplacer pour qu'elle reste toujour dans le coin inéfrieur droit.
y'a un composant que j'avais récupéré qui le faisit déjà. GlacialListView je crois ou quelque chose comme ca. Maintenannt que je comprend un peu mieux les appels de méthodes de l'API, je vais essayer de comprendre comment ils ont fait leur truc.

A l'occasion si tu as de nouveau sur ce sujet, n'hésites surtt pas ;)

Merci !! :big)

Frederyck
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
56
Moi j'ai 3 questions sur ces APIS :

1) comment on sait que tel ou tel problème peut être résolu avec les APIS?
2) Quand on sait que c'est possible, comment trouver la dll qu'il nous faut?
3) Quand enfin on connait la dll, comment on sait quelle méthode il faut utiliser?

Utiliser les APIS = aller chercher une méthode d'une dll? ou quoi?
C'est pas très clair pour moi...
Si quelqu'un veut bien se donner la pein de m'éclairsir...
Messages postés
1182
Date d'inscription
mercredi 21 janvier 2004
Statut
Membre
Dernière intervention
6 septembre 2011
14
1) tu demande a coq
2) tu demande a coq
3) tu demande a coq

;o)))))))))))))))

Arthenius

"Ce qui ne me tue pas, me rend plus fort..."
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
93
lol

1) google + MSDN dans la plupart des cas
2) les requirements, la lib et les headers dans lesquels rechercher les valeurs des constantes sont indiquées en bas de la page de documentation de la methode ou du message qu'on veut utiliser sur MSDN
3) ceci est plutot la 2eme etape ^^

Cocoricoooooooo !!!!
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
56
Mais si je fais

[DllImport("user32.dll", EntryPoint="SendMessage")]
private static extern int SendMessageSetBkImage(
IntPtr hWndControl,
uint messID,
uint wParam,
ref LVBKIMAGE lParam
); 


Ca veut dire que je vais chercher une méthode d'une certaine dll? Et ensuite je peux utiliser cette méthode (SendMessageSetBkImage) dans le code de ma class???
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
93
oui
ce code permet de faire appel a la methode exportée SendMessage de user32.dll

je l'ai nommée SendMessageSetBkImage car des fois au sein de la même classe on a besoin d'y faire appel mais avec des parametres differents (c'est justement le cas ici avec la methode SendMessageLong de Frederyck)

Cocoricoooooooo !!!!