Soyez le premier à donner votre avis sur cette source.
Vue 6 077 fois - Téléchargée 450 fois
#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()
Et merci car ça fait deux jours que je galère pour un Drag and drop de fichiers
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 !
exemple d'application : MétaOutilex : src & exe
et MétaProg : exe
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 ?
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.