Glisser des fichiers sur votre appli [win32] [utilisation win32 ou mfc explicité]

Soyez le premier à donner votre avis sur cette source.

Vue 3 743 fois - Téléchargée 611 fois

Description

extrait de MP

on m'a demandé comment gérer le drop de fichiers sur l'appli....

Ca date de 2003 mé bon...

tout d'abord :
une versiion ultra simplifiée

____________________________________
#include "BListeIndir.hpp"
#include <windows.h>

void recupNomFichierDragDrop(HDROP* leDrop, BLBString* listeResult);

void OnDropFiles(HDROP hDropInfo)
{
BLBString listeFicSrces;
recupNomFichierDragDrop0(&hDropInfo, &listeFicSrces);
MessageBox(NULL,listeFicSrces.toString(),"liste fic drag n drop",MB_OK|MB_ICONINFORMATION);
}

void recupNomFichierDragDrop0(HDROP* leDrop, BLBString* listeResult)
{
HDROP hDropInfo=*leDrop;
BString rep;
int nb,taille=0,i;
nb=DragQueryFile(hDropInfo, 0xFFFFFFFF, NULL, 0 );
if(nb==0)
PB1("un appel inutil à la fonction BVisuel::recupNomFichierDragDrop");
char*fic=NULL;
for( i = 0; i < nb; i++ )
{
taille=DragQueryFile(hDropInfo, i, NULL, 0 )+1;
ALLOUEn(fic , char , taille );
DragQueryFile(hDropInfo, i, fic, taille );
//C OK, on a le nom du fichier
rep=fic;
FREE(fic);
if(rep!="")
(*listeResult)+=rep;
}
DragFinish(hDropInfo); //vidage de la mem...
  • leDrop=hDropInfo; //TOCHECK : transmistion de param...

}

Source / Exemple :


//appel :sur cet evt : WM_DROPFILES

void DMetaProgPrinc::OnDropFiles(HDROP hDropInfo)
{
/// ----------------------------------------------------------------------------
/// ---------------- DMetaProgPrinc::OnDropFiles(HDROP hDropInfo) ----------------
/// ----------------------------------------------------------------------------
/// -----  Objectif	: drag & Drop de fichiers sur la fenêtre
/// -----  Auteur(s)	: Bruno CELLE 27/04/03
/// -----  PreCond	: /
/// -----  PostCond	: /
/// -----  Etat		: 1			(-1<0<1<2)
/// ----------------------------------------------------------------------------
/// -----  HDROP hDropInfo	: liste d'objets glissés (fichiers)
/// ----------------------------------------------------------------------------
/// -----  Var : classes externes dont on appelle des méthodes (2)	: BFichier ,BVisuel
/// -----  Var Utilisées de la classe (5)	: bModeAjjout ,listeFicSrces ,m_sNomSrce ,m_sRep ,traitementEnCours
/// -----  Var Muettes (cf.partie préc) (1)	: hDropInfo
/// -----  Var Internes à la fonction (3)	: listeExtentionsOK ,nomFic ,plomp
/// -----  Var In  (4)	: bModeAjjout ,hDropInfo ,listeFicSrces ,traitementEnCours
/// -----  Var In  Globales (1)	: iLangageLogiciel
/// -----  Var In  Globales Constantes (1)	: TRAITE_EXCEPTION_B
/// -----  Var Out (1)	: m_sRep
/// -----  Var In-Out (1)	: m_sNomSrce
	UpdateData(true);
	/// algo : sécu
	if(traitementEnCours)
	{
		BVisuel::alerte("Un traitement est en cours, veuillez renouveller ce Drag & Drop à la fin...!",false);
		return;
	}
	try
	{
		{
			BString plomp=m_sNomSrce;
			if(!bModeAjjout||plomp.beginWith('.'))
				listeFicSrces.vide();
		}
		BString nomFic;
		BLBString listeExtentionsOK(true,false);
		listeExtentionsOK+=(BString)"c";	//operator = pose pb en mode direct
		listeExtentionsOK+=(BString)"cpp";
		listeExtentionsOK+=(BString)"h";
		listeExtentionsOK+=(BString)"hpp";
		listeExtentionsOK+=(BString)"java";
		listeExtentionsOK+=(BString)"pl";	//prolog
		listeExtentionsOK+=(BString)"trace";	//trace d'exécution
		listeExtentionsOK+=(BString)"ini";	//fichier ini...
		{
			nomFic=BFichier::recupNomFichierDragDrop(&hDropInfo,BLang::BLang::getTxtLangue("fichiersDropWarning"), &listeExtentionsOK, &listeFicSrces,false,!bModeAjjout );
		}
		m_sNomSrce=nomFic;
		UpdateData(false);
		majAffichageChgt();
		BString plomp;
		plomp=listeFicSrces.getNbElts();
		if(iLangageLogiciel>1)
			plomp+=" éléments";
		else
			plomp+=" élément";
		if(listeFicSrces.getNbElts()>1)
			plomp+=" s";
		plomp+=" à traiter : \n";
		plomp+=listeFicSrces.toString();
		plomp.winFormat();
		m_sRep=plomp;
	}
	TRAITE_EXCEPTION_B;
	UpdateData(false);
}

//rappel de BFichier::recupNomFichierDragDrop

BString BFichier::recupNomFichierDragDrop(HDROP* leDrop, const BString& MessageErreur, BLBString* listeExtentionsOK, BLBString* listeResult, bool tolerence, bool imposeMmExtensionPrListe)
{
/// --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
/// ---------------- BFichier::recupNomFichierDragDrop(HDROP* leDrop ,const BString& MessageErreur ,BLBString* listeExtentionsOK ,BLBString* listeResult ,bool tolerence ,bool imposeMmExtensionPrListe) -> BString ----------------
/// --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
/// -----  Objectif	: recuperer les Noms de Fichiers glissés (Drag And Drop) accepte certain type de fichier et en tolère éventuellement d'autres
/// -----  Auteur(s)	: aide Visual - Bruno CELLE 01/03/03
/// -----  PreCond	: listeResult sans doublon
/// -----  PostCond	: /
/// -----  Etat		: 1			(-1<0<1<2)
/// --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
/// -----  HDROP* leDrop	: var recupérée : en gros, liste de fichiers trainés
/// -----  const BString& MessageErreur	: cf.nom
/// -----  BLBString* listeExtentionsOK	: cf.nom
/// -----  BLBString* listeResult: liste des fichiers trainés
/// -----  bool tolerence	: tolerence des fichiers n'ayant pas la bonne extension
/// -----  bool imposeMmExtensionPrListe	: impose la meme extension pour toute la  liste
/// --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
/// -----  retour (BString)	: le nom long du fichier trainé... ou 'Liste' si une liste est trainée
/// --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
/// -----  Var : classes externes dont on appelle des méthodes (1)	: BVisuel
/// -----  Var Muettes (cf.partie préc) (6)	: MessageErreur ,imposeMmExtensionPrListe ,leDrop ,listeExtentionsOK ,listeResult ,tolerence
/// -----  Var Internes à la fonction (8)	: ext ,extOK ,fic ,hDropInfo ,i ,nb ,rep ,taille
/// -----  Var Utilisées par adresse (1)	: fic
/// -----  Var In  (4)	: MessageErreur ,imposeMmExtensionPrListe ,listeResult ,tolerence
/// -----  Var In-Out (1)	: leDrop
		HDROP hDropInfo=*leDrop;
	// structure d'un HDROP
	//UINT DragQueryFile(
	//    HDROP hDrop,
	//    UINT iFile,
	//   LPTSTR lpszFile,
	//    UINT cch
	////	UpdateData(true);
		BString rep,ext,extOK;
		int nb,taille,i;
		taille=0;
		nb=0;
		nb=DragQueryFile(hDropInfo, 0xFFFFFFFF, NULL, 0 );
		if(nb==0)
			PB1("un appel inutil à la fonction BVisuel::recupNomFichierDragDrop");
		char*fic=NULL;
	//	i=0;
		for( i = 0; i < nb; i++ )
		{
				taille=DragQueryFile(hDropInfo, i, NULL, 0 )+1;
				ALLOUEn(fic , char , taille );
				DragQueryFile(hDropInfo, i, fic, taille );
			//C OK, on a le nom du fichier
			//verif de son type et remplacement si c'est un bak
				ext=extraitExtension(fic);
				if(taille>4 && ext=="bak")
					fic[taille-5]='\0';
			//ext=BFichier::extraitExtension(fic);
				ext=extraitExtension(fic);
				rep=fic;
				if(!listeExtentionsOK->checkIn(ext))
				{
						BString plomp=MessageErreur;
						plomp+="\n\n fichier trainé : \n";
						plomp+=rep;
						plomp+="\n\n\t";
						if(!tolerence)
							plomp+="non ";
						plomp+="toléré";
						BVisuel::alerte(plomp);
						if(!tolerence)
							rep="";
				}
				FREE(fic);
				if(imposeMmExtensionPrListe && i==0)
					extOK=ext;
				if(rep!="" && imposeMmExtensionPrListe && i>0 && extOK!=ext)
				{
						BString plomp="La liste trainée doit comporter uniquement des éléments de même extension\n";
						plomp+=extOK;
						plomp+='\n';
						plomp+=rep;
						plomp+="\n ignoré";
						BVisuel::alerte(plomp,false);
						rep="";
				}
				if(rep!="")
					(*listeResult)+=rep;
		}
		DragFinish(hDropInfo);	//vidage de la mem...

  • leDrop=hDropInfo; //TOCHECK : transmistion de param...
if(listeResult->getNbElts()>1) rep="Liste"; else if(listeResult->getNbElts()>0) rep=listeResult->getAt(0); //secu pour les fichiers ignorés return rep; }

Conclusion :


Bonne Prog
++

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
1100
Date d'inscription
jeudi 24 avril 2003
Statut
Membre
Dernière intervention
17 octobre 2012
5
Voici une version 100% compatible Dev-C++ que j'ai corrigé :
#include <windows.h>

LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

char szClassName[ ] = "WindowsApp";


void recupNomFichierDragDrop(HDROP* leDrop, char* listeResult)
{
HDROP hDropInfo=*leDrop;
int nb,taille,i;
taille=0;
nb=0;
nb=DragQueryFile(hDropInfo, 0xFFFFFFFF, NULL, 0 );
/*if(nb==0)
PB1("un appel inutil à la fonction BVisuel::recupNomFichierDragDrop");*/
char fic[500];
for( i = 0; i < nb; i++ )
{
taille=DragQueryFile(hDropInfo, i, NULL, 0 )+1;
DragQueryFile(hDropInfo, i, fic, taille );
strcat(listeResult,"\n");
strcat(listeResult,fic);
}
DragFinish(hDropInfo); //vidage de la mem...
*leDrop=hDropInfo; //TOCHECK : transmistion de param...
}

void OnDropFiles(HDROP hDropInfo)
{
char listeFicSrces[5000];
recupNomFichierDragDrop(&hDropInfo, listeFicSrces);
MessageBox(NULL,listeFicSrces,"Liste :",MB_OK|MB_ICONINFORMATION);
}



int WINAPI WinMain (HINSTANCE hThisInstance,
HINSTANCE hPrevInstance,
LPSTR lpszArgument,
int nFunsterStil)

{
HWND hwnd;
MSG messages;
WNDCLASSEX wincl;

wincl.hInstance = hThisInstance;
wincl.lpszClassName = szClassName;
wincl.lpfnWndProc = WindowProcedure;
wincl.style = CS_DBLCLKS;
wincl.cbSize = sizeof (WNDCLASSEX);

wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
wincl.lpszMenuName = NULL;
wincl.cbClsExtra = 0;
wincl.cbWndExtra = 0;
wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
if (!RegisterClassEx (&wincl))
return 0;

hwnd = CreateWindowEx (
WS_EX_ACCEPTFILES,szClassName,"Drop Files",WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,544,375,HWND_DESKTOP,NULL,
hThisInstance,NULL);

ShowWindow (hwnd, nFunsterStil);

while (GetMessage (&messages, NULL, 0, 0))
{
TranslateMessage(&messages);
DispatchMessage(&messages);
}

return messages.wParam;
}


LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_DROPFILES:
OnDropFiles((HDROP) wParam);
break;
case WM_DESTROY:
PostQuitMessage (0);
break;
default:
return DefWindowProc (hwnd, message, wParam, lParam);
}

return 0;
}
Messages postés
1878
Date d'inscription
jeudi 16 octobre 2003
Statut
Membre
Dernière intervention
16 mars 2011
1
une version sans mes bibli !!!!
compilée sous devC++
personnellement je la trouve très lourde en ressource & pas pratique car non dynamique.... & sans protection
mais bon, ça a résolu 2 demandes sur msn alors... la voici
___________________________________________
#include <windows.h>

LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

char szClassName[ ] = "WindowsApp";

void recupNomFichierDragDrop(HDROP* leDrop, char** listeResult);
void OnDropFiles(HDROP hDropInfo)
{
char listeFicSrces[50000];
recupNomFichierDragDrop(&hDropInfo, &listeFicSrces);
MessageBox(NULL,listeFicSrces,"liste fic drag n drop",MB_OK|MB_ICONINFORMATION);
}


void recupNomFichierDragDrop(HDROP* leDrop, char** listeResult)
{
HDROP hDropInfo=*leDrop;
int nb,taille,i;
taille=0;
nb=0;
nb=DragQueryFile(hDropInfo, 0xFFFFFFFF, NULL, 0 );
if(nb==0)
PB1("un appel inutil à la fonction BVisuel::recupNomFichierDragDrop");
char fic[500];
for( i = 0; i < nb; i++ )
{
taille=DragQueryFile(hDropInfo, i, NULL, 0 )+1;
DragQueryFile(hDropInfo, i, fic, taille );
strcat(*listeResult,"\n");
strcat(*listeResult,fic);
}
DragFinish(hDropInfo); //vidage de la mem...
*leDrop=hDropInfo; //TOCHECK : transmistion de param...
}


int WINAPI WinMain (HINSTANCE hThisInstance,
HINSTANCE hPrevInstance,
LPSTR lpszArgument,
int nFunsterStil)

{
HWND hwnd;
MSG messages;
WNDCLASSEX wincl;

wincl.hInstance = hThisInstance;
wincl.lpszClassName = szClassName;
wincl.lpfnWndProc = WindowProcedure;
wincl.style = CS_DBLCLKS;
wincl.cbSize = sizeof (WNDCLASSEX);

wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
wincl.lpszMenuName = NULL;
wincl.cbClsExtra = 0;
wincl.cbWndExtra = 0;
wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
if (!RegisterClassEx (&wincl))
return 0;

hwnd = CreateWindowEx (
WS_EX_ACCEPTFILES,szClassName,"Windows App",WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,544,375,HWND_DESKTOP,NULL,
hThisInstance,NULL);

ShowWindow (hwnd, nFunsterStil);

while (GetMessage (&messages, NULL, 0, 0))
{
TranslateMessage(&messages);
DispatchMessage(&messages);
}

return messages.wParam;
}


LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_DROPFILES:
MessageBox(hwnd,"Vous avez glissé un ou plusiers fichier(s) !!!","Info",MB_OK|MB_ICONINFORMATION);
OnDropFiles((HDROP) wParam);
break;
case WM_DESTROY:
PostQuitMessage (0);
break;
default:
return DefWindowProc (hwnd, message, wParam, lParam);
}

return 0;
}
Messages postés
1878
Date d'inscription
jeudi 16 octobre 2003
Statut
Membre
Dernière intervention
16 mars 2011
1
avec pr seul include : BFichier
Messages postés
1878
Date d'inscription
jeudi 16 octobre 2003
Statut
Membre
Dernière intervention
16 mars 2011
1
TRAITE_EXCEPTION_B;
Messages postés
1878
Date d'inscription
jeudi 16 octobre 2003
Statut
Membre
Dernière intervention
16 mars 2011
1
ah....
CT po ça
BFichier est OK

C l'appel à simplifier


=>


try
{
BLBString listeFicSrces;
BString nomFic=BFichier::recupNomFichierDragDrop(&hDropInfo,"erreur de drop", NULL, &listeFicSrces,false,false);
BVisuel::informe(listeFicSrces.toString());
}
Afficher les 17 commentaires

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.