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()
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.