[win32] petit répertoire téléphonique et autres (gestion listview)

Soyez le premier à donner votre avis sur cette source.

Vue 8 794 fois - Téléchargée 918 fois


Description

Bonjour à tous.
Bon, voilà une petite appli tout "bête". Elle permet d'enregistrer les coordonnées de ses contacts dans un tableau (graphique).
Ça existe déjà, je sais. Alors quel intérêt ?
- Personnellement, j'avais besoin d'un outil de ce genre, sans vouloir me prendre la tête avec de grosses artilleries comme "Excel" ou les Gestions de bases de données (de plus, je ne me sers pas de 90% de leurs fonctions).
- Très petit (l'exécutable fait 46ko (à titre d'exemple, le bloc-note de Windows en fait 69, je crois).
- Exemple d'utilisation de listview, d'une part pour moi, puis pour ceux qui seront intéressés.
- Besoin d'aucun module extérieur, seul l'exécutable suffit.
- Utilisation très simple quoi, clics et double-clics.

Codé sous Code::Blocks.
Il y a une aide pour l'utilisation, mais je l'explique dans la partie "conclusion".

Source / Exemple :


#define _WIN32_IE 0x0700
#include <windows.h>
#include <commctrl.h>
#include <stdio.h>
#include <math.h>

#define HDF_SORTUP 0x0400
#define HDF_SORTDOWN 0x0200
//Variables globales et prototypes
HINSTANCE hinst;
LRESULT CALLBACK MainWndProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
int start=1,grid=1,modif=0;
HWND hwnd,ListView,hTTip,save,load,hLVHeader,add,supp,aide,about;
HMENU hMenu;
#include "define.h"
//Déclaration de la fenêtre
int WINAPI WinMain(HINSTANCE hinstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) {
    //Verification que le programme n'est pas déjà ouvert
    if (FindWindow(0,"Repertoire") != 0) {
        MessageBox(0,"Une application Repertoire est déjà en cours.\t\n"
            "Vous ne pouvez pas ouvrir deux fois cette même application.\t\n","Repertoire - Erreur",MB_OK|MB_ICONERROR);
        return 0;
    }
    //Variables
    MSG msg;
    hinst=hinstance;
    //Paramètres de la fenêtre
    WNDCLASS wc;
    wc.style=0;
    wc.lpfnWndProc=MainWndProc;
    wc.cbClsExtra=0;
    wc.cbWndExtra=0;
    wc.hInstance=hinstance;
    wc.hIcon=LoadIcon(hinstance,MAKEINTRESOURCE(1));
    wc.hCursor=LoadCursor(NULL,IDC_ARROW);
    wc.hbrBackground=(HBRUSH)(COLOR_3DFACE+1);
    wc.lpszMenuName=0;
    wc.lpszClassName="MaWinClass";
    if(!RegisterClass(&wc)) return FALSE;
    //Création de la fenêtre
    int cxS=GetSystemMetrics(SM_CXSCREEN);
    int cyS=GetSystemMetrics(SM_CYSCREEN);
    InitMenus();
    hwnd=CreateWindowEx(WS_EX_WINDOWEDGE,"MaWinClass","Repertoire",WS_CLIPCHILDREN|WS_OVERLAPPEDWINDOW,(cxS-700)/2,(cyS-350)/2,260,350,HWND_DESKTOP,hMenu,hinstance,NULL);
    //Mise en place des contrôles
    add=CreateWindowEx(0,"BUTTON","Ajouter...",BS_DEFPUSHBUTTON|WS_CHILD|WS_VISIBLE,0,0,0,0,hwnd,(HMENU)ID_AJOUTER,hinstance,NULL);
    SendMessage(add,WM_SETFONT,(WPARAM)GetStockObject(DEFAULT_GUI_FONT),MAKELPARAM(TRUE,0));
    supp=CreateWindowEx(0,"BUTTON","Supprimer",BS_PUSHBUTTON|WS_CHILD|WS_VISIBLE|WS_DISABLED,0,0,0,0,hwnd,(HMENU)ID_SUPPRIMER,hinstance,NULL);
    SendMessage(supp,WM_SETFONT,(WPARAM)GetStockObject(DEFAULT_GUI_FONT),MAKELPARAM(TRUE,0));
    save=CreateWindowEx(0,"BUTTON","Enregistrer",BS_PUSHBUTTON|WS_CHILD|WS_VISIBLE,0,0,0,0,hwnd,(HMENU)ID_ENREGISTRER,hinstance,NULL);
    SendMessage(save,WM_SETFONT,(WPARAM)GetStockObject(DEFAULT_GUI_FONT),MAKELPARAM(TRUE,0));
    about=CreateWindowEx(0,"BUTTON","©",BS_PUSHBUTTON|WS_CHILD|WS_VISIBLE,0,0,0,0,hwnd,(HMENU)ID_ABOUT,hinstance,NULL);
    SendMessage(about,WM_SETFONT,(WPARAM)GetStockObject(DEFAULT_GUI_FONT),MAKELPARAM(TRUE,0));
    aide=CreateWindowEx(0,"BUTTON","?",BS_PUSHBUTTON|WS_CHILD|WS_VISIBLE,0,0,0,0,hwnd,(HMENU)ID_AIDE,hinstance,NULL);
    SendMessage(aide,WM_SETFONT,(WPARAM)GetStockObject(DEFAULT_GUI_FONT),MAKELPARAM(TRUE,0));

    InitListView();
    EnableMenuItem((HMENU)MAKEINTRESOURCE("LEMNU"),ID_SUPPRIMER,MF_GRAYED);
    //Création des Tooltips
    TOOLINFO ti;
    RECT rect;
    hTTip=CreateWindow(TOOLTIPS_CLASS,NULL,WS_POPUP|TTS_NOPREFIX,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,hwnd,NULL,hinstance,NULL);
    GetClientRect(hwnd,&rect);
    ti.cbSize=sizeof(TOOLINFO);
    ti.uFlags=TTF_SUBCLASS;
    GetClientRect(hwnd,&rect);
    for(int a=1;a <= 10;a++) {
        ti.hwnd=GetDlgItem(hwnd,a);
        ti.uId=0;
        if (a == ID_LISTVIEW)
            ti.lpszText="Repertoire de contacts";
        else if (a == ID_ENREGISTRER)
            ti.lpszText="Enregistrer les contacts";
        else if (a == ID_CHARGER)
            ti.lpszText="Charger une liste de contacts";
        else if (a == ID_AJOUTER)
            ti.lpszText="Ajouter un contact";
        else if (a == ID_SUPPRIMER)
            ti.lpszText="Supprimer le contact";
        else if (a == ID_ABOUT)
            ti.lpszText="Afficher les copyrights du logiciel";
        else
            ti.lpszText="";
        ti.rect.left=rect.left;
        ti.rect.top=rect.top;
        ti.rect.right=rect.right;
        ti.rect.bottom=rect.bottom;
        SendMessage(hTTip,TTM_ADDTOOL,0,(LPARAM)&ti);
    }
    InitListe();
    //Affichage du programme
    if (!hwnd) return FALSE;
    ShowWindow(hwnd,nCmdShow);
    while (GetMessage(&msg,NULL,0,0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}
//Fonction d'appel
LRESULT CALLBACK MainWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
	LPNMLISTVIEW pnmv;
	HDITEM hdi;
    EnableWindow(save,(modif)?TRUE:FALSE);
    EnableMenuItem(hMenu,ID_ENREGISTRER,(modif)?MF_ENABLED:MF_GRAYED);
    switch (uMsg) {
        case WM_CLOSE:
            VerifSave();
            break;
        case WM_COMMAND:
            switch (LOWORD(wParam)) {
                case 102:
                    VerifSave();
                    break;
                case 103:
                    if (GetMenuState(hMenu,104,MF_BYCOMMAND) == MF_UNCHECKED) {
                        nSort=HDF_SORTUP;
                        hdi.fmt&=~HDF_SORTDOWN;
                        hdi.fmt|=HDF_SORTUP;
                        Header_SetItem(hLVHeader,SUBITEM,&hdi);
                        ListView_SortItems(ListView,lpCompareFunctions[nSelectedColumn],0);
                        CheckMenuItem(hMenu,104,MF_UNCHECKED);
                        CheckMenuItem(hMenu,103,MF_CHECKED);
                    }
                    break;
                case 104:
                    if (GetMenuState(hMenu,104,MF_BYCOMMAND) == MF_UNCHECKED) {
                        nSort=HDF_SORTDOWN;
                        hdi.fmt&=~HDF_SORTUP;
                        hdi.fmt|=HDF_SORTDOWN;
                        Header_SetItem(hLVHeader,SUBITEM,&hdi);
                        ListView_SortItems(ListView,lpCompareFunctions[nSelectedColumn],0);
                        CheckMenuItem(hMenu,103,MF_UNCHECKED);
                        CheckMenuItem(hMenu,104,MF_CHECKED);
                    }
                    break;
                case 105:
                    SendMessage(ListView,LVM_SETEXTENDEDLISTVIEWSTYLE,LVS_EX_GRIDLINES,(grid)?~LVS_EX_GRIDLINES:LVS_EX_GRIDLINES);
                    CheckMenuItem(hMenu,105,(grid)?MF_UNCHECKED:MF_CHECKED);
                    grid=(grid)?0:1;
                    break;
                case 106:
                    if (MessageBox(hwnd,"Etes-vous sûr(e) de vouloir supprimer tous les contacts ?\t\n",
                        "Avertissement",MB_ICONINFORMATION|MB_YESNO) == IDYES) {
                        ListView_DeleteAllItems(ListView);
                        modif=1;
                    }
                    break;
                case ID_AJOUTER:
                    DialogBox(hinst,"AjoutBox",hwnd,(DLGPROC)DialogProc1);
                    break;
                case ID_SUPPRIMER:
                    if (MessageBox(hwnd,"Etes-vous sûr(e) de vouloir supprimer ce contact ?\t\n",
                        "Avertissement",MB_ICONINFORMATION|MB_YESNO) == IDYES) {
                        ListView_DeleteItem(ListView,ITEM);
                        EnableWindow(supp,FALSE);
                        EnableMenuItem(hMenu,ID_SUPPRIMER,MF_GRAYED);
                        modif=1;
                    }
                    break;
                case ID_ENREGISTRER:
                    Save();
                    break;
                case ID_AIDE:
                    MessageBox(hwnd,Help,"Aide du logiciel",MB_OK|MB_ICONQUESTION);
                    break;
                case ID_ABOUT:
                    MessageBox(hwnd,"- Repertoire -\nLogiciel pour garder en mémoire les coordonnées de ses ami(e)s\t\n(copyrights © WINKEL Vincent)\t\n",
                        "A propos...",MB_OK|MB_ICONASTERISK);
                    break;
            }
            break;
        case WM_DESTROY:
                PostQuitMessage(0);
            break;
        case WM_SIZE:
            int cX=LOWORD(lParam)+1;
            int cY=HIWORD(lParam);
            MoveWindow(ListView,0,0,cX,cY-24,TRUE);
            MoveWindow(add,2,cY-22,70,20,TRUE);
            MoveWindow(supp,72,cY-22,70,20,TRUE);
            MoveWindow(save,142,cY-22,70,20,TRUE);
            MoveWindow(aide,225,cY-22,25,20,TRUE);
            break;
        case WM_SIZING:
            RECT* wndRect=(RECT*)lParam;
            int cXp=wndRect->right-wndRect->left;
            int cYp=wndRect->bottom-wndRect->top;
            if (cXp < 260) wndRect->right=260+wndRect->left;
            if (cYp < 350) wndRect->bottom=350+wndRect->top;
            break;
        case WM_NOTIFY:
             if ((((LPNMHDR)lParam)->hwndFrom) == ListView) {
                if ((((LPNMHDR)lParam)->code) == NM_CLICK) {
                    LPNMITEMACTIVATE lpnmitem=(LPNMITEMACTIVATE)lParam;
                    ITEM=lpnmitem->iItem;
                    EnableWindow(supp,(ITEM != -1)?TRUE:FALSE);
                    EnableMenuItem(hMenu,ID_SUPPRIMER,(ITEM != -1)?MF_ENABLED:MF_GRAYED);
                }
                if ((((LPNMHDR)lParam)->code) == NM_DBLCLK) {
                    LPNMITEMACTIVATE lpnmitem=(LPNMITEMACTIVATE)lParam;
                    ITEM=lpnmitem->iItem;
                    SUBITEM=lpnmitem->iSubItem;
                    if (ITEM == -1)
                        break;
                    DialogBox(hinst,"InsertBox",hwnd,(DLGPROC)DialogProc);
                    break;
                }
                if ((((LPNMHDR)lParam)->code) == LVN_COLUMNCLICK) {
                    pnmv=(LPNMLISTVIEW)lParam;
                    hdi.mask=HDI_FORMAT;
                    Header_GetItem(hLVHeader,pnmv->iSubItem,&hdi);
                    if(pnmv->iSubItem > 0)
                        return 0;
                    if(nSelectedColumn == pnmv->iSubItem) {
                        if(nSort == HDF_SORTDOWN) {
                            nSort=HDF_SORTUP;
                            hdi.fmt&=~HDF_SORTDOWN;
                            hdi.fmt|=HDF_SORTUP;
                        }
                        else {
                            nSort=HDF_SORTDOWN;
                            hdi.fmt&=~HDF_SORTUP;
                            hdi.fmt|=HDF_SORTDOWN;
                        }
                        Header_SetItem(hLVHeader,pnmv->iSubItem,&hdi);
                    }
                    ListView_SortItems(ListView,lpCompareFunctions[nSelectedColumn],0);
                    break;
                }
             }
        default:
            return DefWindowProc(hwnd,uMsg,wParam,lParam);
    }
}

Conclusion :


Après avoir ajouté un contact (clic sur "Ajouter") il suffit de double-cliquer sur la case à remplir et ajouter le texte.
On peut enregistrer sa liste de contacts, cela créé un fichier 'Ma_liste.wbd' à la racine de l'exécutable. Si vous voulez créer plusieurs listes ben... il faudra les renommer ^^.

Je précise aussi que pour la gestion de la listview, je me suis largement inspiré du code de vecchio56 (j'en ai même c/c quelques lignes)
disponible ici : http://www.cppfrance.com/codes/TRI-COLONNES-LISTVIEW-WIN32_24239.aspx
+ utilisation du snippet de BruNews pour s'assurer du dossier courant dans le répertoire de l'exe.

Voilà.

Codes Sources

A voir également

Ajouter un commentaire Commentaires
pgl10 Messages postés 364 Date d'inscription samedi 18 décembre 2004 Statut Membre Dernière intervention 2 mars 2023 9
29 oct. 2008 à 20:45
Cela me plait bien ... Je propose :
1°) En quittant sans mise à jour, au lieu d'afficher :
Le repertoire a été modifié. Etes-vous sûr(e) de vouloir quitter l'application ?
Il serait encore plus explicite d'afficher :
Le répertoire modifié n'est pas enregistré. Etes-vous sûr(e) de vouloir quitter l'application ?
2°) Et dans l'aide il serait plus explicite de dire :
II. Ajouter/modifier des informations sur un contact
Dans la ligne du contact à modifier doucle-cliquez sur le champ à mettre à jour.
Bravo.
uaip Messages postés 1466 Date d'inscription mardi 20 février 2007 Statut Membre Dernière intervention 7 février 2011
29 oct. 2008 à 21:00
Oui exact, ce sont 2 "problèmes" que je me suis posé.
Pour le premier, je me demandais même si mettre un truc du genre "Le répertoire a été modifié. Avant de quitter, voulez-vous l'enregistrer?" avec comme choix "oui", "non" ou "annuler" (pour ne par quitter, finalement). C'est ce qu'on trouve dans la plupart des logiciels, mais je ne sais pas pourquoi je ne l'ai pas fait... par flemme, sans doute.

Par contre pour le 2ème point tu as entièrement raison, je ne savais pas trop comment formuler ça.
Je corrigerai demain.
Merci :)
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 17
30 oct. 2008 à 10:39
Je ne vois nulle part que tu garantis l'emplacement du fichier dans le dossier de l'exe.
uaip Messages postés 1466 Date d'inscription mardi 20 février 2007 Statut Membre Dernière intervention 7 février 2011
30 oct. 2008 à 12:23
file=fopen("Ma_liste.wbd","w");
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 17
30 oct. 2008 à 12:57
Bien ce que je dis, rien n'assure la CurrentDirectory dans dossier de l'exe.
Bidouille le raccourci lanceur de l'exe et tu verras.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.