Accueil > > > UTILISATION DE LISTVIEW, TRIE DES ELEMENTS, ET STYLE XP
UTILISATION DE LISTVIEW, TRIE DES ELEMENTS, ET STYLE XP
Information sur la source
Description
Ca y est j'ai decidé de mettre mon premier code, j'ai vu que les list view étaient un prob recurrent donc voili un petit code. J'ai essayé de faire simple, normalement tout est suffisamment commenté pour suivre le fil ;-). le code en lui-meme : -> Initialisation du controle list view -> creation des colonnes -> gestion des fleches sur les colonnes -> ajout d'element -> filtrage de la listview sur clique (colonne) (le filtrage est fait sans structure supplementaire : la listview suffit) -> Style XP (manifest inclut a l'exe -> c'est plus propre ;-)) Pour voir comment on met en place le style XP il suffit d'editer "res.rc" et de regarder a la fin du fichier. Ca devrait vous paraitre logique. Sinon pour les fautes d'orthographe...dsl voila hesitez pas a poser des questions si y a des trucs qui vous paraissent louche.
Source
- #define _WIN32_WINNT 0x501 //Utile pour HDF_SORTUP et HDF_SORTDOWN
-
- #include <windows.h>
- #include <commctrl.h> //Pour les composants list_view
- #pragma comment(lib,"comctl32.lib")
-
- #include "resource.h"
-
- static HINSTANCE hInst=NULL;
- static HWND mainDlg=NULL; //Dialogue pricipale
-
- void initListView(HWND hDlg)
- //Initialise la list view
- {
- HWND hwndListView = GetDlgItem(hDlg,IDC_LIST_FICHIER);
- LV_COLUMN lvColumn; //descripteur de colonne
- lvColumn.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
- lvColumn.fmt = LVCFMT_RIGHT;
- lvColumn.cx = 80;
- lvColumn.pszText = "Numero";
- ListView_InsertColumn(hwndListView,0,(LPARAM)&lvColumn);
- lvColumn.cx = 80;
- lvColumn.pszText = "Chaine";
- ListView_InsertColumn(hwndListView,0,(LPARAM)&lvColumn);
- ListView_SetExtendedListViewStyleEx(hwndListView,0,LVS_EX_FULLROWSELECT|
- LVS_EX_HEADERDRAGDROP);
- }
-
- void fillListView(HWND hDlg)
- //Rempli la liste view par des lignes -> pas tres propre mais suffisant pour piger
- {
- //recuperation de la list
- HWND hwndListView = GetDlgItem(hDlg,IDC_LIST_FICHIER);
-
- //Initialisation de la Structure de la ListView
- LVITEM LvItem;
- LvItem.mask = LVIF_TEXT | LVIF_PARAM | LVIF_STATE;
- LvItem.state = 0;
- LvItem.stateMask = 0;
- LvItem.iItem = 0; //numéro de l'item
- LvItem.lParam = 0; //Sert lors d'un tri
- LvItem.iSubItem = 0; //index dans la ligne
-
- int itemPos = ListView_InsertItem(hwndListView,(LPARAM)&LvItem);
- //Chaine
- ListView_SetItemText(hwndListView,itemPos,0,"Texte");
- //Chiffre
- ListView_SetItemText(hwndListView,itemPos,1,"455");
-
- itemPos = ListView_InsertItem(hwndListView,(LPARAM)&LvItem);
- //Chaine
- ListView_SetItemText(hwndListView,itemPos,0,"Texte2");
- //Chiffre
- ListView_SetItemText(hwndListView,itemPos,1,"2000");
-
- itemPos = ListView_InsertItem(hwndListView,(LPARAM)&LvItem);
- //Chaine
- ListView_SetItemText(hwndListView,itemPos,0,"Texte4");
- //Chiffre
- ListView_SetItemText(hwndListView,itemPos,1,"200");
-
-
- itemPos = ListView_InsertItem(hwndListView,(LPARAM)&LvItem);
- //Chaine
- ListView_SetItemText(hwndListView,itemPos,0,"_BlaBLUDI");
- //Chiffre
- ListView_SetItemText(hwndListView,itemPos,1,"400");
- }
-
- int CALLBACK CompareNumberFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
- //Fonction de comparaison de chiffres
- {
- //Lecture des items
- HWND hListView = GetDlgItem(mainDlg,IDC_LIST_FICHIER);
- char chaineChiffre1[11];
- ListView_GetItemText(hListView,lParam1,1,chaineChiffre1,11);
- char chaineChiffre2[11];
- ListView_GetItemText(hListView,lParam2,1,chaineChiffre2,11);
-
- //Conversion des chaines en int
- int chiffre1 = atoi(chaineChiffre1);
- int chiffre2 = atoi(chaineChiffre2);
-
- //Calcul du resultat
- if( lParamSort == HDF_SORTUP ) //Trie croissant
- {
- if( chiffre1<chiffre2 )
- {
- return 1;
- }
- else
- {
- if( chiffre1==chiffre2 )
- {
- return 0;
- }
- else
- {
- return -1;
- }
- }
- }
- else //trie decroissant
- {
- if( chiffre1<chiffre2 )
- {
- return -1;
- }
- else
- {
- if( chiffre1==chiffre2 )
- {
- return 0;
- }
- else
- {
- return 1;
- }
- }
- }
- }
-
- int CALLBACK CompareStringFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
- //Fonction de comparaison de chaine de caracteres
- {
- //Lecture des items de la liste
- HWND hListView = GetDlgItem(mainDlg,IDC_LIST_FICHIER);
- char chaine1[1024];
- ListView_GetItemText(hListView,lParam1,0,chaine1,1024);
- char chaine2[1024];
- ListView_GetItemText(hListView,lParam2,0,chaine2,1024);
-
- //Resultat de la comparaison
- int cmpResult = strcmp(chaine1,chaine2);
- if( lParamSort == HDF_SORTUP )
- {
- cmpResult*=-1;
- }
-
- return cmpResult;
- }
-
- void OnListViewColumnClick(HWND hDlg,LPARAM lParam)
- //Gestion de l'evenement de clique sur une colonne.
- {
- //Indique la collonne precedemment selectionnee
- static int collonneSelectionne = -1;
- static int sensTrie;
-
- LPNMLISTVIEW pnmv = (LPNMLISTVIEW) lParam;
-
- //Recuperation de l'header (pnmv->iSubItem contient le numero de la collone
- cliquee)
- HDITEM hdi;
- hdi.mask = HDI_FORMAT;
- HWND hListView = GetDlgItem(hDlg,IDC_LIST_FICHIER);
- HWND header = ListView_GetHeader(hListView);
- Header_GetItem(header, pnmv->iSubItem, &hdi);
-
- if( collonneSelectionne!=-1 ) //Une colonne deja selectionnee
- {
- if( collonneSelectionne==pnmv->iSubItem ) //Meme colonne
- {
- if( sensTrie == HDF_SORTDOWN ) //Trie decroissant en cours
- {
- sensTrie = HDF_SORTUP; //inversion du trie
- hdi.fmt &= ~HDF_SORTDOWN;
- hdi.fmt |= HDF_SORTUP;
- }
- else //Trie croissant en cours
- {
- sensTrie = HDF_SORTDOWN; //inversion du trie
- hdi.fmt &= ~HDF_SORTUP;
- hdi.fmt |= HDF_SORTDOWN;
- }
-
- //On modifie l'header
- Header_SetItem(header, pnmv->iSubItem, &hdi);
- }
- else //Colonne differente et donc raz de l'header
- {
- //Suppression de la fleche de trie
- Header_GetItem(header, collonneSelectionne, &hdi);
- hdi.fmt &= ~HDF_SORTUP & ~HDF_SORTDOWN;
- Header_SetItem(header, collonneSelectionne, &hdi);
-
- //On affiche la nouvelle fleche
- collonneSelectionne = pnmv->iSubItem;
- Header_GetItem(header, collonneSelectionne, &hdi);
- hdi.fmt |= HDF_SORTDOWN;
- sensTrie = HDF_SORTDOWN;
- Header_SetItem(header, collonneSelectionne, &hdi);
- }
- }
- else //Nouvelle collonne
- {
- collonneSelectionne = pnmv->iSubItem;
- Header_GetItem(header, collonneSelectionne, &hdi);
- hdi.fmt |= HDF_SORTDOWN;
- sensTrie = HDF_SORTDOWN;
- Header_SetItem(header, collonneSelectionne, &hdi);
- }
-
- //Lancement du trie
- ListView_SortItemsEx(hListView,
- collonneSelectionne==1?CompareNumberFunc:CompareStringFunc,
- sensTrie);
- }
-
- LRESULT CALLBACK DlgMainProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
- //Fonction de traitement de nos messages
- {
- switch(uMsg)
- {
- case WM_INITDIALOG: //Premier message recu avant affichage du dialogue
- initListView(hDlg); //Initialisation des listviews
- fillListView(hDlg); //Met des donnees dans la listview
- return TRUE;
- case WM_NOTIFY: //Notification d'evenement (ex: listview)
- switch(wParam)
- {
- case IDC_LIST_FICHIER:
- {
- switch (((NM_LISTVIEW*)lParam)->hdr.code)
- {
- case LVN_COLUMNCLICK : //Evenement de clique
- sur une colonne
- OnListViewColumnClick(hDlg,lParam);
- return TRUE;
- }
- }
- }
- case WM_COMMAND:
- switch(wParam)
- {
- case WM_DESTROY:
- case WM_CLOSE:
- EndDialog(hDlg,0); //Fermeture du dialogue principal
- PostQuitMessage(0); //Fin de l'application
- return TRUE;
- }
- }
- return FALSE;
- }
-
- int WINAPI WinMain( HINSTANCE hInstance,HINSTANCE hPrevInst,LPSTR lpCmdLine,
- int nCmdShow)
- //Point d'entree du programme
- {
- //Instance de notre appli
- hInst = hInstance;
-
- //Initialisation des controles utilises
- INITCOMMONCONTROLSEX initControl;
- initControl.dwSize = sizeof(initControl);
- initControl.dwICC = ICC_LISTVIEW_CLASSES;//Classe a charger
- InitCommonControlsEx(&initControl);
-
- //Creation du dialogue principal
- mainDlg=CreateDialog(hInstance,MAKEINTRESOURCE(IDD_MAIN),NULL,
- (DLGPROC)DlgMainProc);
- ShowWindow(mainDlg,SW_SHOW);
-
- //traitement des messages
- MSG msg;
- while(GetMessage(&msg,NULL,0,0)==TRUE)
- {
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
-
- return 0;
- }
#define _WIN32_WINNT 0x501 //Utile pour HDF_SORTUP et HDF_SORTDOWN
#include <windows.h>
#include <commctrl.h> //Pour les composants list_view
#pragma comment(lib,"comctl32.lib")
#include "resource.h"
static HINSTANCE hInst=NULL;
static HWND mainDlg=NULL; //Dialogue pricipale
void initListView(HWND hDlg)
//Initialise la list view
{
HWND hwndListView = GetDlgItem(hDlg,IDC_LIST_FICHIER);
LV_COLUMN lvColumn; //descripteur de colonne
lvColumn.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
lvColumn.fmt = LVCFMT_RIGHT;
lvColumn.cx = 80;
lvColumn.pszText = "Numero";
ListView_InsertColumn(hwndListView,0,(LPARAM)&lvColumn);
lvColumn.cx = 80;
lvColumn.pszText = "Chaine";
ListView_InsertColumn(hwndListView,0,(LPARAM)&lvColumn);
ListView_SetExtendedListViewStyleEx(hwndListView,0,LVS_EX_FULLROWSELECT|
LVS_EX_HEADERDRAGDROP);
}
void fillListView(HWND hDlg)
//Rempli la liste view par des lignes -> pas tres propre mais suffisant pour piger
{
//recuperation de la list
HWND hwndListView = GetDlgItem(hDlg,IDC_LIST_FICHIER);
//Initialisation de la Structure de la ListView
LVITEM LvItem;
LvItem.mask = LVIF_TEXT | LVIF_PARAM | LVIF_STATE;
LvItem.state = 0;
LvItem.stateMask = 0;
LvItem.iItem = 0; //numéro de l'item
LvItem.lParam = 0; //Sert lors d'un tri
LvItem.iSubItem = 0; //index dans la ligne
int itemPos = ListView_InsertItem(hwndListView,(LPARAM)&LvItem);
//Chaine
ListView_SetItemText(hwndListView,itemPos,0,"Texte");
//Chiffre
ListView_SetItemText(hwndListView,itemPos,1,"455");
itemPos = ListView_InsertItem(hwndListView,(LPARAM)&LvItem);
//Chaine
ListView_SetItemText(hwndListView,itemPos,0,"Texte2");
//Chiffre
ListView_SetItemText(hwndListView,itemPos,1,"2000");
itemPos = ListView_InsertItem(hwndListView,(LPARAM)&LvItem);
//Chaine
ListView_SetItemText(hwndListView,itemPos,0,"Texte4");
//Chiffre
ListView_SetItemText(hwndListView,itemPos,1,"200");
itemPos = ListView_InsertItem(hwndListView,(LPARAM)&LvItem);
//Chaine
ListView_SetItemText(hwndListView,itemPos,0,"_BlaBLUDI");
//Chiffre
ListView_SetItemText(hwndListView,itemPos,1,"400");
}
int CALLBACK CompareNumberFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
//Fonction de comparaison de chiffres
{
//Lecture des items
HWND hListView = GetDlgItem(mainDlg,IDC_LIST_FICHIER);
char chaineChiffre1[11];
ListView_GetItemText(hListView,lParam1,1,chaineChiffre1,11);
char chaineChiffre2[11];
ListView_GetItemText(hListView,lParam2,1,chaineChiffre2,11);
//Conversion des chaines en int
int chiffre1 = atoi(chaineChiffre1);
int chiffre2 = atoi(chaineChiffre2);
//Calcul du resultat
if( lParamSort == HDF_SORTUP ) //Trie croissant
{
if( chiffre1<chiffre2 )
{
return 1;
}
else
{
if( chiffre1==chiffre2 )
{
return 0;
}
else
{
return -1;
}
}
}
else //trie decroissant
{
if( chiffre1<chiffre2 )
{
return -1;
}
else
{
if( chiffre1==chiffre2 )
{
return 0;
}
else
{
return 1;
}
}
}
}
int CALLBACK CompareStringFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
//Fonction de comparaison de chaine de caracteres
{
//Lecture des items de la liste
HWND hListView = GetDlgItem(mainDlg,IDC_LIST_FICHIER);
char chaine1[1024];
ListView_GetItemText(hListView,lParam1,0,chaine1,1024);
char chaine2[1024];
ListView_GetItemText(hListView,lParam2,0,chaine2,1024);
//Resultat de la comparaison
int cmpResult = strcmp(chaine1,chaine2);
if( lParamSort == HDF_SORTUP )
{
cmpResult*=-1;
}
return cmpResult;
}
void OnListViewColumnClick(HWND hDlg,LPARAM lParam)
//Gestion de l'evenement de clique sur une colonne.
{
//Indique la collonne precedemment selectionnee
static int collonneSelectionne = -1;
static int sensTrie;
LPNMLISTVIEW pnmv = (LPNMLISTVIEW) lParam;
//Recuperation de l'header (pnmv->iSubItem contient le numero de la collone
cliquee)
HDITEM hdi;
hdi.mask = HDI_FORMAT;
HWND hListView = GetDlgItem(hDlg,IDC_LIST_FICHIER);
HWND header = ListView_GetHeader(hListView);
Header_GetItem(header, pnmv->iSubItem, &hdi);
if( collonneSelectionne!=-1 ) //Une colonne deja selectionnee
{
if( collonneSelectionne==pnmv->iSubItem ) //Meme colonne
{
if( sensTrie == HDF_SORTDOWN ) //Trie decroissant en cours
{
sensTrie = HDF_SORTUP; //inversion du trie
hdi.fmt &= ~HDF_SORTDOWN;
hdi.fmt |= HDF_SORTUP;
}
else //Trie croissant en cours
{
sensTrie = HDF_SORTDOWN; //inversion du trie
hdi.fmt &= ~HDF_SORTUP;
hdi.fmt |= HDF_SORTDOWN;
}
//On modifie l'header
Header_SetItem(header, pnmv->iSubItem, &hdi);
}
else //Colonne differente et donc raz de l'header
{
//Suppression de la fleche de trie
Header_GetItem(header, collonneSelectionne, &hdi);
hdi.fmt &= ~HDF_SORTUP & ~HDF_SORTDOWN;
Header_SetItem(header, collonneSelectionne, &hdi);
//On affiche la nouvelle fleche
collonneSelectionne = pnmv->iSubItem;
Header_GetItem(header, collonneSelectionne, &hdi);
hdi.fmt |= HDF_SORTDOWN;
sensTrie = HDF_SORTDOWN;
Header_SetItem(header, collonneSelectionne, &hdi);
}
}
else //Nouvelle collonne
{
collonneSelectionne = pnmv->iSubItem;
Header_GetItem(header, collonneSelectionne, &hdi);
hdi.fmt |= HDF_SORTDOWN;
sensTrie = HDF_SORTDOWN;
Header_SetItem(header, collonneSelectionne, &hdi);
}
//Lancement du trie
ListView_SortItemsEx(hListView,
collonneSelectionne==1?CompareNumberFunc:CompareStringFunc,
sensTrie);
}
LRESULT CALLBACK DlgMainProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
//Fonction de traitement de nos messages
{
switch(uMsg)
{
case WM_INITDIALOG: //Premier message recu avant affichage du dialogue
initListView(hDlg); //Initialisation des listviews
fillListView(hDlg); //Met des donnees dans la listview
return TRUE;
case WM_NOTIFY: //Notification d'evenement (ex: listview)
switch(wParam)
{
case IDC_LIST_FICHIER:
{
switch (((NM_LISTVIEW*)lParam)->hdr.code)
{
case LVN_COLUMNCLICK : //Evenement de clique
sur une colonne
OnListViewColumnClick(hDlg,lParam);
return TRUE;
}
}
}
case WM_COMMAND:
switch(wParam)
{
case WM_DESTROY:
case WM_CLOSE:
EndDialog(hDlg,0); //Fermeture du dialogue principal
PostQuitMessage(0); //Fin de l'application
return TRUE;
}
}
return FALSE;
}
int WINAPI WinMain( HINSTANCE hInstance,HINSTANCE hPrevInst,LPSTR lpCmdLine,
int nCmdShow)
//Point d'entree du programme
{
//Instance de notre appli
hInst = hInstance;
//Initialisation des controles utilises
INITCOMMONCONTROLSEX initControl;
initControl.dwSize = sizeof(initControl);
initControl.dwICC = ICC_LISTVIEW_CLASSES;//Classe a charger
InitCommonControlsEx(&initControl);
//Creation du dialogue principal
mainDlg=CreateDialog(hInstance,MAKEINTRESOURCE(IDD_MAIN),NULL,
(DLGPROC)DlgMainProc);
ShowWindow(mainDlg,SW_SHOW);
//traitement des messages
MSG msg;
while(GetMessage(&msg,NULL,0,0)==TRUE)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
Conclusion
j'ai mis initié mais c pas du code tres difficile si on connait deja un peu la prog windows.
Historique
- 14 décembre 2004 22:03:22 :
- correction orthographe...
- 14 décembre 2004 22:08:02 :
- retouche screenshot et affichage main.cpp
- 15 décembre 2004 14:47:53 :
- Ajout de l'exe au zip
- 15 décembre 2004 14:51:40 :
- ...
Sources de la même categorie
Commentaires et avis
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Forum
RE : SAC A DOS RE : SAC A DOS par hadjkaddour
Cliquez pour lire la suite par hadjkaddour
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|