Le premier site francophone dédié au développement Pocket PC


Comment tailler automatiquement les colonnes d'un ListView ?
 
u  

 

Le mode "Report" du contrôle ListView est très pratique. Pour peu qu'on y ajoute le "FullRowSelect" et le "GridLine", cette vue est très agréable à utiliser, et pour le développeur, très agréable à programmer. Un petit casse tête est la largeur des colonnes, on ne sais jamais quelle taille donner aux colonnes au démarrage. Il y a une solution, et comme pour le "FullRowSelect" et le "GridLine", il faut envoyer un message au ListView.

Envoyer un message au ListView

Note: La technique que nous utilisons ici est celle que nous avons déjà utilisé pour rendre notre ListView FullRowSelect et pour lui ajouter une grille.

Pour envoyer un message il faut utiliser la fonction "SendMessage" qui est incluse dans la librairie dynamique Coredll (comme souvent). Cette API est déclarée en eVB de la manière suivante :

Declare Function SendMessage Lib "Coredll" Alias "SendMessageW" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Pour envoyer un message à un contrôle, il faut donner en paramètre de la fonction "SendMessage" le handle du contrôle (le hWnd), ce qui nous pose un gros problème car le contrôle ListView de eVB ne nous fournit pas cette information. Pour contourner ce problème, nous allons récupérer le hWnd de notre ListView grace à la fonction "GetFocus" (encore une API de Coredll) qui retourne le hWnd de l'objet qui a le focus au moment de l'appel. Ce système fonctionne très bien mais il faut impérativement que le contrôle ListView soit visible et qu'il ait le focus. La fonction "GetFocus" se déclare en eVB de la manière suivante :

Public Declare Function GetFocus Lib "Coredll" () As Long

Demander à chaque colonne de s'autosizer (comment dire çà vite en français ?)

Pour indiquer au ListView il faut lui envoyer pour chaque colonne un message LVM_SETCOLUMNWIDTH. Ce message est déclaré comme ceci en eVB :


Const LVM_SETCOLUMNWIDTH = &H101E

Nous pouvons maintenant écrire un fonction qui retaille les colonnes :

Sub LVAutosize(ByVal wLV As ListViewCtrl)

Dim h As Long
Dim i As Integer

Call wLV.SetFocus
h = GetFocus()

For i = 0 To (wLV.ColumnHeaders.Count - 1)
Call SendMessage(h, LVM_SETCOLUMNWIDTH, i, -2)
Next

End Sub


Voilà, une prise de tête de moins.

 


Stéphane Sibué

 
       
   
 
   
Copyright 2001-2004 - Tous droits réservés
 
   

iPAQ est un produit de COMPAQ.
Visual Tools est un produit de Microsoft Corporation.
Toutes les autres marques et produits présents dans ces pages sont la propriété exclusive de leurs sociétés respectives.