Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

[WIN32][C][DEV-C++] SPLITALL GESTIONNAIRE DE DÉCOUPAGE / RECOLLAGE DE FICHIERS SIMPLE


Information sur la source

Catégorie :Fichiers / Disque Classé sous : drag, decoupe, fichier, drop, listbox Niveau : Débutant Date de création : 07/06/2007 Date de mise à jour : 10/06/2007 19:22:12 Vu / téléchargé: 3 683 / 188

Note :
Aucune note

Commentaire sur cette source (6)
Ajouter un commentaire et/ou une note


Description

Cliquez pour voir la capture en taille normale
Voici un petit utilitaire sans grande prétention :)

Le but de cet utilitaire est de diviser des fichiers en morceaux de taille voulu

Les fonctionnalités / fonctionnement:

- découpage / recollage de fichier de taille en ko
- agencement dans une Listbox
- utilisation d'une dialog comme fenêtre principal
- gestion du drag and drop
- gestion du répertoire de destination (attention le même pour tous les fichiers)

j'ai essayé de commenter un maximum.

Pour exécuter le programme renommer le fichier "SplitAll.ex" en "SplitAll.exe"

Vos commentaires sont les bien venu :)
 

Source

  • //------------------------------------------------------------------------------
  • // Projet SplitAll : découpage de fichier + recollage
  • // Auteur : Hanteville Nicolas
  • // Fichier : main.c
  • // Version : 0.1
  • // Date de modification : 07/06/2007
  • //------------------------------------------------------------------------------
  • //------------------------------------------------------------------------------
  • // gestion des includes
  • //------------------------------------------------------------------------------
  • #include "ressources.h"
  • //------------------------------------------------------------------------------
  • // nous renvoie le nom du fichier pour un chemin
  • char *StripNomDest(char *dest)
  • {
  • //on se place a la fin de la chaine
  • while(*dest) dest++;
  • //on place le curseur au début du nom du fichier (situé aprèss le dernier / ou \)
  • while(*dest != '\\' && *dest != '/') dest--;
  • dest++;
  • return dest;
  • }
  • //------------------------------------------------------------------------------
  • //fonctions de threads
  • //------------------------------------------------------------------------------
  • //découpe
  • DWORD WINAPI Decoupee(LPVOID lParam)
  • {
  • //nb items a traiter
  • unsigned int max = SendMessage(H_LST,LB_GETCOUNT,(WPARAM)0,(LPARAM)0);
  • if (!max) return 0;
  • unsigned int total = max;
  • unsigned int i;
  • DWORD copiee;
  • char tmp[TAILLE_REP_FIC];
  • GetWindowText(H_EDIT,tmp,TAILLE_REP_FIC);
  • __int64 taille_fichier_sortie = _atoi64(tmp)*1024; //talle en koctet maximum par fichier
  • __int64 taille_total;
  • char item[TAILLE_REP_FIC];
  • HWND Hsrc,Hdest;
  • char buffer[taille_fichier_sortie];
  • if (taille_fichier_sortie>0)
  • {
  • //on ouvre chacun des fichiers de la liste un par un
  • while(max--){
  • i=1;//numéro de nomage commence a 1
  • //récupération du texte du 1er item
  • SendMessage(H_LST,LB_GETTEXT,(WPARAM)0,(LPARAM)item);
  • //on ouvre le fichier
  • Hsrc= CreateFile(item,FILE_SHARE_READ,0,0,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,0);
  • if (Hsrc != INVALID_HANDLE_VALUE)
  • {
  • taille_total = GetFileSize(Hsrc,NULL);
  • while (taille_total>0 && Hdest!=INVALID_HANDLE_VALUE)
  • {
  • ReadFile(Hsrc, buffer, taille_fichier_sortie,&copiee, 0);
  • snprintf(tmp,TAILLE_REP_FIC,"%s\\%s.%03d",DEstDEfaultTmp,StripNomDest(item),i++);
  • Hdest= CreateFile(tmp,GENERIC_WRITE,0,0,CREATE_ALWAYS,FILE_FLAG_SEQUENTIAL_SCAN,0);
  • if (Hdest==INVALID_HANDLE_VALUE)
  • MessageBox(0,tmp,"Erreur de copie!!",MB_OK|MB_TOPMOST|MB_ICONINFORMATION);
  • else
  • {
  • WriteFile(Hdest,buffer,copiee,&copiee,0);
  • }
  • CloseHandle(Hdest);
  • taille_total-=copiee;
  • }
  • }else
  • MessageBox(0,item,"Erreur Fichier passé!!!",MB_OK|MB_TOPMOST|MB_ICONINFORMATION);
  • SendMessage(H_PROGRESS_BAR, PBM_SETPOS, (WPARAM)(total-max)*100/total, 0);
  • CloseHandle(Hsrc);
  • //on supprime le 1er item
  • SendMessage(H_LST,LB_DELETESTRING,(WPARAM)0,(LPARAM)0);
  • }
  • //progression
  • SendMessage(H_PROGRESS_BAR, PBM_SETPOS, (WPARAM)0, 0);
  • }else
  • MessageBox(0,"Il faut indiquer une taille minimum de fichier","Erreur!!!",MB_OK|MB_TOPMOST|MB_ICONINFORMATION);
  • }
  • //------------------------------------------------------------------------------
  • //recoller
  • DWORD WINAPI Recollee(LPVOID lParam)
  • {
  • //nb items
  • unsigned int max = SendMessage(H_LST,LB_GETCOUNT,(WPARAM)0,(LPARAM)0);
  • if (!max) return 0;
  • unsigned int total = max;
  • char tmp[TAILLE_REP_FIC];
  • char item[TAILLE_REP_FIC];
  • DWORD copiee;
  • //récupération du texte du 1er item
  • SendMessage(H_LST,LB_GETTEXT,(WPARAM)0,(LPARAM)item);
  • snprintf(tmp,TAILLE_REP_FIC,"%s\\%s",DEstDEfaultTmp,StripNomDest(item));
  • tmp[strlen(tmp)-4]=0; //on enlève l'extension S01
  • //ouverture du fichier de destination
  • HWND Hdest= CreateFile(tmp,GENERIC_WRITE,0,0,CREATE_ALWAYS,FILE_FLAG_SEQUENTIAL_SCAN,0);
  • if (Hdest != INVALID_HANDLE_VALUE)
  • {
  • HWND Hsrc;
  • __int64 taille_fic=0;
  • char *buffer;
  • //gestion automatique
  • //si un seul fichier a recoler on récupère les items automatiquement
  • if (max ==1)
  • {
  • int i=1;
  • //progression
  • SendMessage(H_PROGRESS_BAR, PBM_SETPOS, (WPARAM)50, 0);
  • do{
  • //génération du nom du fichier
  • sprintf(item,"%s.%03d",tmp,i);
  • //on ouvre le fichier
  • Hsrc= CreateFile(item,GENERIC_READ,0,0,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,0);
  • //si ok on continue sinon méssage de choix
  • if (Hsrc != INVALID_HANDLE_VALUE)
  • {
  • //récupération de la taille du fichier
  • taille_fic = GetFileSize(Hsrc,NULL);
  • if (taille_fic>0)
  • {
  • buffer = malloc(taille_fic);
  • //on copie le comptenu du fichier dans le nouveau fichier / a la suite
  • ReadFile(Hsrc, buffer, taille_fic,&copiee,0);
  • WriteFile(Hdest,buffer,copiee,&copiee,0);
  • free(buffer);
  • }
  • }
  • CloseHandle(Hsrc);
  • i++;
  • }while (Hsrc != INVALID_HANDLE_VALUE);
  • SendMessage(H_PROGRESS_BAR, PBM_SETPOS, (WPARAM)100, 0);
  • //on supprime le 1er item
  • SendMessage(H_LST,LB_DELETESTRING,(WPARAM)0,(LPARAM)0);
  • }else
  • {
  • while (max--)
  • {
  • //récupération du texte du 1er item
  • SendMessage(H_LST,LB_GETTEXT,(WPARAM)0,(LPARAM)item);
  • //on ouvre le fichier
  • Hsrc= CreateFile(item,GENERIC_READ,0,0,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,0);
  • //si ok on continue sinon méssage de choix
  • if (Hsrc != INVALID_HANDLE_VALUE)
  • {
  • //récupération de la taille du fichier
  • taille_fic = GetFileSize(Hsrc,NULL);
  • if (taille_fic>0)
  • {
  • buffer = malloc(taille_fic);
  • //on copie le comptenu du fichier dans le nouveau fichier / a la suite
  • ReadFile(Hsrc, buffer, taille_fic,&copiee,0);
  • WriteFile(Hdest,buffer,copiee,&copiee,0);
  • free(buffer);
  • }else
  • MessageBox(0,item,"Erreur Fichier passé!!!",MB_OK|MB_TOPMOST|MB_ICONINFORMATION);
  • }else
  • MessageBox(0,item,"Erreur Fichier passé!!!",MB_OK|MB_TOPMOST|MB_ICONINFORMATION);
  • CloseHandle(Hsrc);
  • //on supprime le 1er item
  • SendMessage(H_LST,LB_DELETESTRING,(WPARAM)0,(LPARAM)0);
  • //progression
  • SendMessage(H_PROGRESS_BAR, PBM_SETPOS, (WPARAM)(total-max)*100/total, 0);
  • };
  • }
  • }else
  • MessageBox(0,"Erreur : reconstitution de fichier impossible !!!","Erreur",MB_OK|MB_TOPMOST|MB_ICONINFORMATION);
  • //progression
  • SendMessage(H_PROGRESS_BAR, PBM_SETPOS, (WPARAM)0, 0);
  • CloseHandle(Hdest);
  • }
  • //------------------------------------------------------------------------------
  • //gestion des appels et msg sur le fenêtre principale
  • HRESULT DlgProc(HWND hwnd,UINT Msg,WPARAM Wparam,LPARAM lParam)
  • {
  • HDROP H_DropInfo;
  • int nb,i;
  • char *tmp;
  • switch(Msg)
  • {
  • case WM_INITDIALOG:
  • InitCommonControls();
  • //récupération des handl généraux
  • H_EDIT = GetDlgItem(hwnd,EDIT_TAILLE);
  • H_LST = GetDlgItem(hwnd,LST);
  • H_PROGRESS_BAR = GetDlgItem(hwnd,PROGRESS_BAR);
  • //application d'une icone
  • SendMessage(hwnd, WM_SETICON, ICON_BIG, (LPARAM)LoadIcon(Hinst, MAKEINTRESOURCE(ID_ICON)));
  • //init barre de progression
  • SendMessage(H_PROGRESS_BAR, PBM_SETPOS, (WPARAM)0, 0);
  • break;
  • case WM_CLOSE:
  • EndDialog(hwnd,0);
  • //PostQuitMessage(0);
  • break;
  • case WM_COMMAND :
  • if ((LOWORD(Wparam) == BT_SUP) && (HIWORD(Wparam) == BN_CLICKED))
  • {
  • //suppression de la sélection
  • SendMessage(H_LST,LB_DELETESTRING,(WPARAM)SendMessage(H_LST,LB_GETCURSEL,(WPARAM)0,(LPARAM)0),(LPARAM)0);
  • }else if ((LOWORD(Wparam) == BT_PLUS) && (HIWORD(Wparam) == BN_CLICKED))
  • {
  • //emplacement du texte actuel
  • int nb = SendMessage(H_LST,LB_GETCURSEL,(WPARAM)0,(LPARAM)0);
  • if (nb>0)
  • {
  • tmp = malloc(TAILLE_REP_FIC);
  • //récupération du texte sélectionné
  • SendMessage(H_LST,LB_GETTEXT,(WPARAM)nb,(LPARAM)tmp);
  • //suppression
  • SendMessage(H_LST,LB_DELETESTRING,(WPARAM)nb,(LPARAM)0);
  • //insertion
  • SendMessage(H_LST,LB_INSERTSTRING,(WPARAM)--nb,(LPARAM)tmp);
  • //application de la sélection
  • SendMessage(H_LST,LB_SETCURSEL ,(WPARAM)nb,(LPARAM)0);
  • free(tmp);
  • }
  • }else if ((LOWORD(Wparam) == BT_MOINS) && (HIWORD(Wparam) == BN_CLICKED))
  • {
  • //emplacement du texte actuel
  • int nb = SendMessage(H_LST,LB_GETCURSEL,(WPARAM)0,(LPARAM)0);
  • int max = SendMessage(H_LST,LB_GETCOUNT,(WPARAM)0,(LPARAM)0);
  • if (nb>=0 && nb<(max-1))
  • {
  • tmp = malloc(TAILLE_REP_FIC);
  • //récupération du texte sélectionné
  • SendMessage(H_LST,LB_GETTEXT,(WPARAM)nb,(LPARAM)tmp);
  • //suppression
  • SendMessage(H_LST,LB_DELETESTRING,(WPARAM)nb,(LPARAM)0);
  • //insertion
  • SendMessage(H_LST,LB_INSERTSTRING,(WPARAM)++nb,(LPARAM)tmp);
  • //application de la sélection
  • SendMessage(H_LST,LB_SETCURSEL ,(WPARAM)nb,(LPARAM)0);
  • free(tmp);
  • }
  • }else if ((LOWORD(Wparam) == BT_RECOLLER) && (HIWORD(Wparam) == BN_CLICKED))
  • {
  • //recollage
  • CreateThread(NULL, 0,Recollee,0,0,0);
  • }else if ((LOWORD(Wparam) == BT_DECOUPE) && (HIWORD(Wparam) == BN_CLICKED))
  • {
  • //découpage
  • CreateThread(NULL, 0,Decoupee,0,0,0);
  • }
  • break;
  • case WM_DROPFILES:
  • tmp = malloc(TAILLE_REP_FIC);
  • //récupération de la liste des fichiers sélectionnés + traitemen
  • H_DropInfo=(HDROP)Wparam;//récupération de la liste
  • //traitement : nb de fichier en drag
  • nb=DragQueryFile(H_DropInfo, 0xFFFFFFFF, NULL, 0 );
  • //demander emplacement de copie
  • BROWSEINFO browser;
  • LPITEMIDLIST lip;
  • browser.hwndOwner = hwnd;
  • browser.pidlRoot = 0;
  • browser.lpfn = 0;
  • browser.ulFlags = BIF_NEWDIALOGSTYLE; //permet l'option de création d'un dossier
  • browser.lParam = 0;
  • browser.pszDisplayName = DEstDEfaultTmp; //résultat ici
  • browser.lpszTitle = "Dossier de destination";
  • lip = SHBrowseForFolder(&browser);
  • if (lip != NULL)
  • {
  • SHGetPathFromIDList(lip,DEstDEfaultTmp);
  • for (i=0;i<nb;i++)
  • {
  • DragQueryFile(H_DropInfo,i,tmp,DragQueryFile(H_DropInfo,i,0,0)+1 ); //récupération
  • SendMessage(H_LST,LB_ADDSTRING,(WPARAM)0,(LPARAM)tmp);
  • }
  • DragFinish(H_DropInfo);//libération de la mémoire
  • }else
  • MessageBox(0,"Erreur : répertoire de destination non valide !!!","Erreur",MB_OK|MB_TOPMOST|MB_ICONINFORMATION);
  • free(tmp);
  • break;
  • }
  • return 0;
  • }
  • //------------------------------------------------------------------------------
  • //fonction principal (main)
  • int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hinstancePRECEDENTE, LPSTR CmdLine, int CmdShow)
  • {
  • Hinst = hInst;
  • //création de la fenêtre
  • DialogBox(0,MAKEINTRESOURCE(SplitAll),GetDesktopWindow(),(DLGPROC)DlgProc);
  • return 0;
  • }
//------------------------------------------------------------------------------
// Projet SplitAll      : découpage de fichier + recollage
// Auteur               : Hanteville Nicolas
// Fichier              : main.c
// Version              : 0.1
// Date de modification : 07/06/2007
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// gestion des includes
//------------------------------------------------------------------------------
#include "ressources.h"
//------------------------------------------------------------------------------
// nous renvoie le nom du fichier pour un chemin
char *StripNomDest(char *dest)
{
  //on se place a la fin de la chaine
  while(*dest) dest++;
  
  //on place le curseur au début du nom du fichier (situé aprèss le dernier / ou \)
  while(*dest != '\\' && *dest != '/') dest--;
  dest++;
  return  dest; 
}
//------------------------------------------------------------------------------
//fonctions de threads
//------------------------------------------------------------------------------
//découpe
DWORD WINAPI Decoupee(LPVOID lParam)
{
//nb items a traiter
    unsigned int max = SendMessage(H_LST,LB_GETCOUNT,(WPARAM)0,(LPARAM)0);
    if (!max) return 0;
    
    unsigned int total = max;
    unsigned int i;
    DWORD copiee;
    char tmp[TAILLE_REP_FIC];
    
    GetWindowText(H_EDIT,tmp,TAILLE_REP_FIC);
    __int64 taille_fichier_sortie = _atoi64(tmp)*1024; //talle en koctet maximum par fichier
    __int64 taille_total;
    char item[TAILLE_REP_FIC];
    HWND Hsrc,Hdest;
    char buffer[taille_fichier_sortie];
    
    if (taille_fichier_sortie>0)
    {
    
    //on ouvre chacun des fichiers de la liste un par un
    while(max--){
       i=1;//numéro de nomage commence a 1
       
       //récupération du texte du 1er item
       SendMessage(H_LST,LB_GETTEXT,(WPARAM)0,(LPARAM)item);
       
       //on ouvre le fichier 
       Hsrc= CreateFile(item,FILE_SHARE_READ,0,0,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,0);

       if (Hsrc != INVALID_HANDLE_VALUE) 
       {
         taille_total = GetFileSize(Hsrc,NULL);
         
         while (taille_total>0 && Hdest!=INVALID_HANDLE_VALUE)
         {
           ReadFile(Hsrc, buffer, taille_fichier_sortie,&copiee, 0);
           
           snprintf(tmp,TAILLE_REP_FIC,"%s\\%s.%03d",DEstDEfaultTmp,StripNomDest(item),i++);
           
           Hdest= CreateFile(tmp,GENERIC_WRITE,0,0,CREATE_ALWAYS,FILE_FLAG_SEQUENTIAL_SCAN,0);
           if (Hdest==INVALID_HANDLE_VALUE)
             MessageBox(0,tmp,"Erreur de copie!!",MB_OK|MB_TOPMOST|MB_ICONINFORMATION);
           else
           {
             WriteFile(Hdest,buffer,copiee,&copiee,0);
           }
           CloseHandle(Hdest);
           
           taille_total-=copiee;
         }

       }else
         MessageBox(0,item,"Erreur Fichier passé!!!",MB_OK|MB_TOPMOST|MB_ICONINFORMATION);
        
        SendMessage(H_PROGRESS_BAR, PBM_SETPOS, (WPARAM)(total-max)*100/total, 0);
       
        CloseHandle(Hsrc);
       
        //on supprime le 1er item
        SendMessage(H_LST,LB_DELETESTRING,(WPARAM)0,(LPARAM)0);
       }

    //progression
    SendMessage(H_PROGRESS_BAR, PBM_SETPOS, (WPARAM)0, 0);
    }else
      MessageBox(0,"Il faut indiquer une taille minimum de fichier","Erreur!!!",MB_OK|MB_TOPMOST|MB_ICONINFORMATION);
}
//------------------------------------------------------------------------------
//recoller
DWORD WINAPI Recollee(LPVOID lParam)
{
    //nb items
    unsigned int max = SendMessage(H_LST,LB_GETCOUNT,(WPARAM)0,(LPARAM)0);
    if (!max) return 0;
    unsigned int total = max;
    char tmp[TAILLE_REP_FIC];
    char item[TAILLE_REP_FIC];
    DWORD copiee;
    
    //récupération du texte du 1er item
    SendMessage(H_LST,LB_GETTEXT,(WPARAM)0,(LPARAM)item);
    snprintf(tmp,TAILLE_REP_FIC,"%s\\%s",DEstDEfaultTmp,StripNomDest(item));
    tmp[strlen(tmp)-4]=0; //on enlève l'extension  S01

    //ouverture du fichier de destination
    HWND Hdest= CreateFile(tmp,GENERIC_WRITE,0,0,CREATE_ALWAYS,FILE_FLAG_SEQUENTIAL_SCAN,0);
    
    if (Hdest != INVALID_HANDLE_VALUE)
    {
      HWND Hsrc;
      __int64 taille_fic=0;
      
      
      char *buffer;
      
      //gestion automatique
      //si un seul fichier a recoler on récupère les items automatiquement
      if  (max ==1)
      {
        int i=1;
        
          //progression
          SendMessage(H_PROGRESS_BAR, PBM_SETPOS, (WPARAM)50, 0);  
          
          
          do{
            //génération du nom du fichier
            sprintf(item,"%s.%03d",tmp,i);
            
            //on ouvre le fichier 
            Hsrc= CreateFile(item,GENERIC_READ,0,0,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,0);
            
            //si ok on continue sinon méssage de choix
            if (Hsrc != INVALID_HANDLE_VALUE) 
            {
              //récupération de la taille du fichier
              taille_fic = GetFileSize(Hsrc,NULL);
              
              if (taille_fic>0)
              {
                 buffer = malloc(taille_fic);
                 
                 //on copie le comptenu du fichier dans le nouveau fichier / a la suite
                 ReadFile(Hsrc, buffer, taille_fic,&copiee,0);
                 WriteFile(Hdest,buffer,copiee,&copiee,0);
    
                 free(buffer);
               }
            }
              
            CloseHandle(Hsrc);

            i++;
          }while (Hsrc != INVALID_HANDLE_VALUE);

          SendMessage(H_PROGRESS_BAR, PBM_SETPOS, (WPARAM)100, 0); 
          //on supprime le 1er item
          SendMessage(H_LST,LB_DELETESTRING,(WPARAM)0,(LPARAM)0);

      }else
      {
        while (max--)
        {
          
          //récupération du texte du 1er item
          SendMessage(H_LST,LB_GETTEXT,(WPARAM)0,(LPARAM)item);
          
          //on ouvre le fichier 
          Hsrc= CreateFile(item,GENERIC_READ,0,0,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,0);
          
          //si ok on continue sinon méssage de choix
          if (Hsrc != INVALID_HANDLE_VALUE) 
          {
            //récupération de la taille du fichier
            taille_fic = GetFileSize(Hsrc,NULL);
            
            if (taille_fic>0)
            {
               buffer = malloc(taille_fic);
               
               //on copie le comptenu du fichier dans le nouveau fichier / a la suite
               ReadFile(Hsrc, buffer, taille_fic,&copiee,0);
               WriteFile(Hdest,buffer,copiee,&copiee,0);
  
               free(buffer);
             }else
            MessageBox(0,item,"Erreur Fichier passé!!!",MB_OK|MB_TOPMOST|MB_ICONINFORMATION);
          
          }else
            MessageBox(0,item,"Erreur Fichier passé!!!",MB_OK|MB_TOPMOST|MB_ICONINFORMATION);
        CloseHandle(Hsrc);
        //on supprime le 1er item
        SendMessage(H_LST,LB_DELETESTRING,(WPARAM)0,(LPARAM)0);
        
        //progression
        SendMessage(H_PROGRESS_BAR, PBM_SETPOS, (WPARAM)(total-max)*100/total, 0);

      };
    }
    }else
      MessageBox(0,"Erreur : reconstitution de fichier impossible !!!","Erreur",MB_OK|MB_TOPMOST|MB_ICONINFORMATION);
      
    //progression
    SendMessage(H_PROGRESS_BAR, PBM_SETPOS, (WPARAM)0, 0);
    
    CloseHandle(Hdest);
}
//------------------------------------------------------------------------------
//gestion des appels et msg sur le fenêtre principale
HRESULT DlgProc(HWND hwnd,UINT Msg,WPARAM Wparam,LPARAM lParam) 
{
 HDROP H_DropInfo;
 int nb,i;
 char *tmp;
  switch(Msg) 
  {
      case WM_INITDIALOG:
           InitCommonControls();
           
           //récupération des handl généraux
          H_EDIT          = GetDlgItem(hwnd,EDIT_TAILLE);
          H_LST           = GetDlgItem(hwnd,LST);
          H_PROGRESS_BAR  = GetDlgItem(hwnd,PROGRESS_BAR);
          
          //application d'une icone
          SendMessage(hwnd, WM_SETICON, ICON_BIG, (LPARAM)LoadIcon(Hinst, MAKEINTRESOURCE(ID_ICON)));
          
          //init barre de progression
          SendMessage(H_PROGRESS_BAR, PBM_SETPOS, (WPARAM)0, 0);
      break;
      case WM_CLOSE:
          EndDialog(hwnd,0);  
          //PostQuitMessage(0);
      break;
      case WM_COMMAND :
           if ((LOWORD(Wparam) == BT_SUP) && (HIWORD(Wparam) == BN_CLICKED))
           {
             //suppression de la sélection
             SendMessage(H_LST,LB_DELETESTRING,(WPARAM)SendMessage(H_LST,LB_GETCURSEL,(WPARAM)0,(LPARAM)0),(LPARAM)0);
           }else if ((LOWORD(Wparam) == BT_PLUS) && (HIWORD(Wparam) == BN_CLICKED))
           {
             //emplacement du texte actuel
             int nb = SendMessage(H_LST,LB_GETCURSEL,(WPARAM)0,(LPARAM)0);
             
             if (nb>0)
             {
               tmp = malloc(TAILLE_REP_FIC);
               
               //récupération du texte sélectionné
               SendMessage(H_LST,LB_GETTEXT,(WPARAM)nb,(LPARAM)tmp);
               
               //suppression
               SendMessage(H_LST,LB_DELETESTRING,(WPARAM)nb,(LPARAM)0);
               
               //insertion
               SendMessage(H_LST,LB_INSERTSTRING,(WPARAM)--nb,(LPARAM)tmp);
               
               //application de la sélection
               SendMessage(H_LST,LB_SETCURSEL ,(WPARAM)nb,(LPARAM)0);
               
               free(tmp);
             }
             
             
           }else if ((LOWORD(Wparam) == BT_MOINS) && (HIWORD(Wparam) == BN_CLICKED))
           {
             //emplacement du texte actuel
             int nb = SendMessage(H_LST,LB_GETCURSEL,(WPARAM)0,(LPARAM)0);
             int max = SendMessage(H_LST,LB_GETCOUNT,(WPARAM)0,(LPARAM)0);
             
             if (nb>=0 && nb<(max-1))
             {
               tmp = malloc(TAILLE_REP_FIC);
               //récupération du texte sélectionné
               SendMessage(H_LST,LB_GETTEXT,(WPARAM)nb,(LPARAM)tmp);
               
               //suppression
               SendMessage(H_LST,LB_DELETESTRING,(WPARAM)nb,(LPARAM)0);
               
               //insertion
               SendMessage(H_LST,LB_INSERTSTRING,(WPARAM)++nb,(LPARAM)tmp);
               
               //application de la sélection
               SendMessage(H_LST,LB_SETCURSEL ,(WPARAM)nb,(LPARAM)0);

               free(tmp);
             }
           }else if ((LOWORD(Wparam) == BT_RECOLLER) && (HIWORD(Wparam) == BN_CLICKED))
           {
                //recollage
                CreateThread(NULL, 0,Recollee,0,0,0);
                
           }else if ((LOWORD(Wparam) == BT_DECOUPE) && (HIWORD(Wparam) == BN_CLICKED))
           {
                //découpage
                CreateThread(NULL, 0,Decoupee,0,0,0); 
           }   
      break;
      case WM_DROPFILES:           
           
           tmp = malloc(TAILLE_REP_FIC);
           
           //récupération de la liste des fichiers sélectionnés + traitemen
           H_DropInfo=(HDROP)Wparam;//récupération de la liste
           
           //traitement : nb de fichier en drag
           nb=DragQueryFile(H_DropInfo, 0xFFFFFFFF, NULL, 0 );
           
           //demander emplacement de copie
            BROWSEINFO browser;
            LPITEMIDLIST lip;
          
            browser.hwndOwner = hwnd;
            browser.pidlRoot = 0;
            browser.lpfn = 0;
            browser.ulFlags = BIF_NEWDIALOGSTYLE; //permet l'option de création d'un dossier
            browser.lParam = 0;
            browser.pszDisplayName = DEstDEfaultTmp;  //résultat ici
            browser.lpszTitle = "Dossier de destination";
            lip = SHBrowseForFolder(&browser);
            if (lip != NULL) 
            {
               SHGetPathFromIDList(lip,DEstDEfaultTmp);

               for (i=0;i<nb;i++)
               {
                 DragQueryFile(H_DropInfo,i,tmp,DragQueryFile(H_DropInfo,i,0,0)+1 ); //récupération
                 SendMessage(H_LST,LB_ADDSTRING,(WPARAM)0,(LPARAM)tmp);
               }
               DragFinish(H_DropInfo);//libération de la mémoire
           }else
             MessageBox(0,"Erreur : répertoire de destination non valide !!!","Erreur",MB_OK|MB_TOPMOST|MB_ICONINFORMATION);
           free(tmp);
      break;
   }     
   return 0;        
}
//------------------------------------------------------------------------------
//fonction  principal (main)
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hinstancePRECEDENTE, LPSTR CmdLine, int CmdShow) 
{  
  Hinst = hInst;
  
  //création de la fenêtre
  DialogBox(0,MAKEINTRESOURCE(SplitAll),GetDesktopWindow(),(DLGPROC)DlgProc); 
   
  return 0;
}

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

10 juin 2007 19:20:07 :
correction de fin de programme utilisation de : EndDialog()
10 juin 2007 19:22:12 :
...

Commentaires et avis

signaler à un administrateur
Commentaire de max12 le 08/06/2007 09:48:28 administrateur CS

Intéressant pour l'utilisation du Drag&Drop. Prochaine étape compresser ça en LZW :P

signaler à un administrateur
Commentaire de omnia le 08/06/2007 12:49:05

Eh bien comme je l'ai dis plus haut, s'était pour faire des test sur des fichiers, mais l'ajout de compression ou tout un tas d'option est possible voir l'imagination ^^.

signaler à un administrateur
Commentaire de gagah1 le 10/06/2007 17:00:29

Juste une petite remarque. Quand tu fermes une boite de dialogue de type modale, utilise EndDialog(...) à la place de PostQuitMessage(...).

signaler à un administrateur
Commentaire de omnia le 10/06/2007 19:01:37

gagah1  tu recommandes de faire un EndDialog() avant un PostQuitMessage ??

au niveau mémoire j'ai fait des tests et apparement, ca ne change rien, mais sur la msdn ils disent:

Dialog boxes created by the DialogBox, DialogBoxParam, DialogBoxIndirect, and DialogBoxIndirectParam functions must be destroyed using the EndDialog function. An application calls EndDialog from within the dialog box procedure; the function must not be used for any other purpose.

...

EndDialog does not destroy the dialog box immediately. Instead, it sets a flag and allows the dialog box procedure to return control to the system. The system checks the flag before attempting to retrieve the next message from the application queue. If the flag is set, the system ends the message loop, destroys the dialog box, and uses the value in nResult as the return value from the function that created the dialog box.

je vais l'ajouter quand même merci ;)

signaler à un administrateur
Commentaire de max12 le 10/06/2007 19:07:16 administrateur CS

J'ai eu des bugs assez étrange quand j'utilisait DestroyWindow au lieu de EndDialog :( (Pas au niveau mémoire, c'est un peu compliqué a expliquer quand tu connais pas le projet)

Tout ça pour te donner une raison de plus d'utiliser EndDialog :P

A+

signaler à un administrateur
Commentaire de omnia le 10/06/2007 19:11:02

Ok merci :)

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

drag&drop sur l'executable [ par crazyh0rse ] je voudrais faire un drag&amp;drop sur l'icone de l'executable et recuper&#233; le nom des fichier drop&#233;.j'arrive a g&#233;r&#233; le drag&amp;dr Drag Drop [ par said01 ] Bonjour,Au momoent d'un drag&amp;Drop depuis l'explorateur windows vers ma treeview, je souhaite&nbsp;d&#233;t&#233;ctcter le pr&#233;sence de la sour Drag and Drop [ par marc_pl ] Bonjour, je suis en train d'&#233;crire un programme qui recherche des fichiers sur un r&#233;seau. Il se compose d'une boite de dialogue contenant 2 Problème entre Tabctrl CListCtrl et le Drag and drop [MFC] [ par MasterShadows ] Salut &#224; tous et &#224; toutes;voil&#224; mon probl&#232;me; je veux faire une clistctrl en drag and drop en utilisant les MFC (cadre d'un cours); Nom de fichier dans un listbox [ par gaillus ] Bonjour &#224; tous,Je voudrais faire afficher dans une listebox des noms de fichier de type audio afin de pouvoir en selectionner un et de le lire.J' Hook drag and drop [ par kakai ] J&#8217;ai un grand besoin d&#8217;aide. <P class=MsoNormal style problème d'agffichage [ par anubis52100 ] je compren pas rein safiche dans ma listbox!!!j'ai cr&#233;er une variable asoci&#233; a ma listbox et a une &#233;ditebox et rein ne safiche dedan j' ListBox et fichier texte [ par lomat62 ] voila je cherche une m&#233;thode qui permet d'afficher le contenu d'un fichier texte dans une listbox. cette liste doit s'afficher suite a un clik ef Ourvri un fichier sous C via un "drag&drop" de l utilisateur [ par pif56 ] Bonjour tout le monde,Je suis nouveau sur le forum, mais pas sur le site. Alors aujourd'hui est venu le jour de ma premiere question!Voila, j ecris un Drag & drop sur exe [ par Galmiza ] Salut tout le monde !J'ai un problème avec les arguments passé à un exe suite à un drag and drop.Lorsque le nombre de fichiers glissés vers l'exe est


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,686 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.