Drag-and-drop de fichiers

Soyez le premier à donner votre avis sur cette source.

Vue 5 755 fois - Téléchargée 427 fois

Description

une petite source pour montrer comment utiliser le drag-and-drop dans un programme.
cet exemple liste tout les fichiers qui ont ete "drag-and-droppées".
Voici les lignes de programme utilies :

DragAcceptFiles(hwnd,TRUE);
DragQueryFile(hDropFiles,i,nameFile,nChar);
DragFinish(hDropFiles);

la source contient aussi des fonctions qui permette d'afficher du texte a l'ecran.

Source / Exemple :


#ifndef _UTIL_H_
	#include "util.h"
#endif // _UTIL_H_

//-------------------------------------------------
#define MAX_CHAR_PER_LINE 256
#define CX_FONT           20
#define CY_FONT           40
#define WEIGHT_FONT       800     // de 0 a 1000, epaisseur du HFONT
#define TYPE_FONT         "Arial" // nom du HFONT
//-------------------------------------------------
typedef struct tagLINE
  {
  char  *text;  // le text
  int   nChar;  // le nombre de caractere
  }LINE,*P_LINE,**PP_LINE;

typedef struct tagTEXT
  {
  // nombre de ligne
  int     nLine;
  // nombre maximal de caracteres par ligne
  int     maxCharPerLine;
  // pointeur sur un tableau de ligne de text (LINE)
  P_LINE  allLine;
  }TEXT,*P_TEXT,**PP_TEXT;

//-------------------------------------------------
// creer un texte compose de <nLine> lignes
void NewText(P_TEXT text,int nLine,int maxCharPerLine)
{
int i;
text->nLine           = nLine;
text->maxCharPerLine  = maxCharPerLine;
text->allLine         = Malloc(LINE,nLine);

for(i=0;i<nLine;i++)
  {
  text->allLine[i].text = Malloc(char,maxCharPerLine);
  }
} // NewText()

//-------------------------------------------------
// enregistre du texte a le ligne numero <iLine>
void WriteText(P_TEXT text,int iLine,char *fmt,...)
{
va_list list;

va_start(list,fmt);
text->allLine[iLine].nChar = _vsnprintf(text->allLine[iLine].text,text->maxCharPerLine,fmt,list);
va_end(list);
} // WriteText()

//-------------------------------------------------
// affiche dans un HDC le texte aux coordonnees (x0,y0)
// en sautant <dy> pixels en Y a chaque nouvelle ligne
void PrintText(P_TEXT text,HDC hdc,int x0,int y0,int dy)
{
int i;

for(i=0;i<text->nLine;i++)
  {
  TextOut(hdc,x0,y0+i*dy,text->allLine[i].text,text->allLine[i].nChar);
  }
} // PrintText()

//-------------------------------------------------
// on detruit le texte
void DeleteText(P_TEXT text)
{
int i;
for(i=0;i<text->nLine;i++)
  {
  Free(text->allLine[i].text);
  }
Free(text->allLine);
} // DeleteText()

//-------------------------------------------------
// WND_PROC
//-------------------------------------------------
LRESULT CALLBACK WndProc(HWND hwnd,UINT iMsg,WPARAM wParam,LPARAM lParam)
{
static TEXT   text;
static HFONT  font;

switch(iMsg)
  {
	case WM_CREATE:
    {
    // on accepte le "drag-and-drop" de fichiers
    DragAcceptFiles(hwnd,TRUE);
    // on cree le HFONT
    font = CreateFont(CY_FONT,CX_FONT,0/*inclinaison du texte*/,0/*genre 'italique programmable'*/,WEIGHT_FONT/*graisse*/,FALSE/*italic*/,FALSE/*souligne*/,FALSE/*barre*/,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,VARIABLE_PITCH+FF_SWISS,TYPE_FONT);
    // on ecrit a l'ecran que l'on a eu pour l'instant aucun fichier
    NewText(&text,2,MAX_CHAR_PER_LINE);
    WriteText(&text,0,"Aucun fichier.");
    WriteText(&text,1,"Il faut faire glisser un ou plusieurs fichier(s) sur cette fenêtre.");
    return 0;
    }
  case WM_DROPFILES:
    {
    HDROP hDropFiles;
    int   nFile,i;

    // on a recu un message, l'utilisateur a fait glisser
    // des fichiers sur notre fenetre
    // nous allons lister ces fichiers

    // on detruit l'ancien texte
    DeleteText(&text);

    // on recupere l'handle sur le "drag-and-drop"
    // c'est lui qui contient tout les infomations
    // sur la liste de fichiers
    hDropFiles = (HDROP)wParam;

    // on recupere le nombre de fichiers
    nFile = DragQueryFile(hDropFiles,0xFFFFFFFF,NULL,0);
    // on connait maintenant le nombre de ligne que l'on va afficheir a l'ecran
    // (une ligne par fichiers plus un ligne au debut)
    NewText(&text,1 + nFile,MAX_CHAR_PER_LINE);

    // on ecrit le nombre de fichiers
    WriteText(&text,0,"drag-and-drop : %d fichier(s)",nFile);

    // on liste tous les fichiers
    for(i=0;i<nFile;i++)
      {
      char              *nameFile;
      int               nChar;
      WIN32_FIND_DATA   dataFile;
      HANDLE            hFile;

      // on recupere le nombre de caractere du nom du fichier
      nChar = 1 + DragQueryFile(hDropFiles,i,NULL,0);
      // on alloue de la memoire pour recevoir le nom du fichier
      nameFile = Malloc(char,nChar);
      // on recupere le nom du fichier
      DragQueryFile(hDropFiles,i,nameFile,nChar);
      // on recupere les informations sur le fichier
      hFile = FindFirstFile(nameFile,&dataFile);
      // on ecrit la ligne correspondante au fichier
      // ATTENTION : la premiere ligne est deja ecrite
      // donc <iLine> commence a 1
      WriteText(&text,1+i," - fichier n°%d : %s [ %d octet(s) ]",i,GetShortFileName(nameFile),(dataFile.nFileSizeHigh*MAXDWORD)+dataFile.nFileSizeLow);
      // on ferme le <hfile>
      FindClose(hFile);
      // on libere la memoire allouee pour le nom du fichier
      Free(nameFile);
      }

    // on a fini de recuperer les fichiers
    // on doit le signalerau systeme d'expoitation
    // par la fonction suivante :
    DragFinish(hDropFiles);

    // on invalide la fenetre pour que le nouveau texte soit affiche directement
    InvalidateRect(hwnd,NULL,TRUE);
    UpdateWindow(hwnd);
    return 0;
    }
	case WM_PAINT:
    {
    PAINTSTRUCT   ps;
    HDC		        hdc;
    HFONT         oldFont;
    // on recupere le HDC
	  hdc = BeginPaint(hwnd,&ps);
    // on selectionne le HFONT
    oldFont = SelectObject(hdc,font);
    // on ecrit le texte
    PrintText(&text,hdc,0,0,CY_FONT);
    // on deselectionne le HFONT
    SelectObject(hdc,oldFont);
    // on libere le HDC
	  EndPaint(hwnd,&ps);
		return 0;
    }
	case WM_DESTROY:
    {
    // on supprime le HFONT
    DeleteObject(font);
    // on supprime le texte
    DeleteText(&text);
    // on quitte le programme
    PostQuitMessage(0);
		return 0;
    }
  }

return DefWindowProc(hwnd,iMsg,wParam,lParam);
} // WndProc()

//-------------------------------------------------
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpszCmdLine,int iCmdShow)
{
WNDCLASSEX  wc;
MSG         msg;
HWND        hwnd;
// on initialise la librarie
InitializationLibUtil();
// on initialise les champs de la classe de fenetre
wc.cbSize        = sizeof(wc);
wc.style         = 0;
wc.lpfnWndProc   = NULL;
wc.cbClsExtra    = 0;
wc.cbWndExtra    = 0;
wc.hInstance     = hInstance;
wc.hIcon         = LoadIcon(NULL,IDI_APPLICATION);
wc.hCursor       = LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName  = NULL;
wc.hIconSm       = LoadIcon(NULL,IDI_APPLICATION);
wc.lpszClassName = "JCD_DragAndDrop";
wc.lpfnWndProc   = WndProc;
// on enregistre la classe
RegisterClassEx(&wc);
// on cree la fenetre
hwnd = CreateWindow("JCD_DragAndDrop",
	                  "le Drag And Drop de fichiers (JCD)",
                    WS_OVERLAPPEDWINDOW,
                    0,0,500,500,
	                  NULL,
                    NULL,
                    hInstance,
                    NULL	                  
                    );

// on affiche la fenetre
ShowWindow(hwnd,SW_SHOWMAXIMIZED);
UpdateWindow(hwnd);
// boucle des messages
while(GetMessage(&msg,NULL,0,0))
	{
	TranslateMessage(&msg);
	DispatchMessage(&msg);
	}
// on ferme la librairie
CloseLibUtil();
CheckingClosingLibUtil();
return msg.wParam;
} // WinMain()

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

PhilLopez
Messages postés
22
Date d'inscription
jeudi 4 février 2010
Statut
Membre
Dernière intervention
24 avril 2010
-
Excuse moi c'est tout bon !
Et merci car ça fait deux jours que je galère pour un Drag and drop de fichiers
PhilLopez
Messages postés
22
Date d'inscription
jeudi 4 février 2010
Statut
Membre
Dernière intervention
24 avril 2010
-
Salut JCDjcd !

Je travail avec Code::Bloc et j'ai essayé tes librairies.
Je n'arrive pas a les faire fonctionné...
A tu une solution pour moi !
magic_Nono
Messages postés
1878
Date d'inscription
jeudi 16 octobre 2003
Statut
Membre
Dernière intervention
16 mars 2011
1 -
erreur de ma part: cet histoire de sélection d'un grd nb de fichier était spécifique à la boite charger....

exemple d'application : MétaOutilex : src & exe
et MétaProg : exe
cs_JCDjcd
Messages postés
1138
Date d'inscription
mardi 10 juin 2003
Statut
Membre
Dernière intervention
25 janvier 2009
2 -
Effectivement ton BFichier le fais, mais pour ce qui est de gere les bonnes extentions :
1 ) c'est pas de but du programme
2 ) c'est pas complique a programme
3 ) il y a beaucoup d'ameliorations que l'on peut faire, mais ce programme a pour but de montrer le minimum pour apres s'en servir comme chacun le veux.

je n'ai pas tres bien compris ce que c'etait cette grande selection de fichiers, comme dans ton source il n'y a pas de .exe, j'ai pas pu tester, donc tu pourrais m'en dire plus ?
cs_JCDjcd
Messages postés
1138
Date d'inscription
mardi 10 juin 2003
Statut
Membre
Dernière intervention
25 janvier 2009
2 -
Heu non il n'y a aucun probleme, c'est une de mes librairies que j'utilise a chaque fois, donc bon je me suis dis que c'est as tres grave si je ne la met pas car elle est dans toute mes sources, mais bon je vais la rajouter maintenant.

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.