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

Soyez le premier à donner votre avis sur cette source.

Vue 7 647 fois - Téléchargée 782 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

uaip
Messages postés
1466
Date d'inscription
mardi 20 février 2007
Statut
Membre
Dernière intervention
7 février 2011
-
Sorry, this file is useless. This header isn't called by any other file. So, you can remove it from the project (if there is the error "can find the file "autres.h", etc").
Else, you can make a new code::blocks project and add only the files in the archive.
("autres.h" was a test file, so useless).
CodeSSourceScom
Messages postés
1
Date d'inscription
mercredi 9 novembre 2005
Statut
Membre
Dernière intervention
9 juin 2009
-
where is the file autres.h? ca not compile complete ly
BruNews
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
16 -
void __stdcall AppPathInitialize()
{
char szthis[300];
char* c = szthis + GetModuleFileName(0, szthis, 300);
while(*c !'\\') c--; *c 0;
SetCurrentDirectory(szthis);
}

Un appel à cela au débur du prog et tout ira bon.
uaip
Messages postés
1466
Date d'inscription
mardi 20 février 2007
Statut
Membre
Dernière intervention
7 février 2011
-
Merci pgl10 ^^
BruNews, on m'avait toujours dit que mettre un chemin relatif laissait croire que le chemin partait du répertoire racine du processus.
Vu qu'à la base, j'avais codé ça pour ma config uniquement, ça me suffisait. Je vais tenter de blinder tout ça.
pgl10
Messages postés
310
Date d'inscription
samedi 18 décembre 2004
Statut
Membre
Dernière intervention
6 juillet 2019
1 -
Ce qui me plait ici c'est une disposition inhabituelle mais judicieuse et élégante de la fenêtre Windows avec la programmation nécessaire pour cela au lieu d'une disposition classique et habituelle mais beaucoup moins adaptée à l'utilisation. Par contre, j'ai tenté, sans réussir, à faire une compilation avec Dev-C++ et avec VC++ 6.0 ( Si quelqu’un y est arrivé : merci de le signaler ). Je n'ai pas installé Code::Blocks. Pour finir, mon point de vue : bon travail !

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.