Drag&Drop (тоскай да кидай xDDD) удобная штука и бывает хочется её применить, в этой “зарисовке” (не путать с пацановскими темами ))) не забываем я пытаюсь показать основные моменты, они могут плохо понятные, если что в коменты и я более подробно объясню, все что делается здесь это больше для себя что бы запомнить). Ну так отступление законченно теперь к делу. Я работаю в VS2010 думаю остальные VS не особенно отличаются в этих вопросах что будет разобрано, в других же IDE ищите сами.
Первое идем в редактор ресурсов выбираем свою форму он же диалог бокс щелкаем по нему в свойствах ищем “Принимать файлы” (английский эквивалент наверное Accept files) выбираем true, сохраняем это дело. Дальше к коду нам нужно зарегать обработчик. Это делается так
BOOL CALLBACK DlgProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam) { switch(msg) { HANDLE_MSG(hwnd,WM_INITDIALOG,DlgInit); HANDLE_MSG(hwnd,WM_COMMAND,DlgCommand); // строка ниже регает колбек на WM_DROPFILES остальное здесь просто для //антуража чтоб голым не выглядело, я тут использую свой шаблон, // который в прошлом посте у вас может быть другой так что не паникуйте xDDD HANDLE_MSG(hwnd,WM_DROPFILES,onDrop); case(WM_CLOSE): EndDialog(hwnd,0); default: return FALSE; } }
Зарегали колбек теперь собственно сама функция, чтобы не плодить много кода, я выложу сразу пример работы а потом объясню что к чему.
void onDrop(HWND hwnd, HDROP hDrop) { UINT count = DragQueryFileA(hDrop,-1,NULL,0); UINT size; char* buffer=NULL; while(count) { count--; size=DragQueryFileA(hDrop,count,NULL,0); buffer=new char[size+1]; ZeroMemory(buffer,size*sizeof(char)); DragQueryFileA(hDrop,count,buffer,size+1); delete[] buffer; } }
Теперь подробнее по каждой функции:
- void onDrop(HWND hwnd, HDROP hDrop) – это у нас колбек собственно назвать его можно как угодно, но прототип должен быть такой.
- DragQueryFileA – собственно суфикс A говорит о том что работаем мы с обычным char’ом, а не с юникодом. Если вторым параметром указываем значение 0xFFFFFFFF (он же -1) функция возвращает, количество файлов упавших на форму. Если же какое либо число в диапазоне от 0 до n где n количество упавших файлов то функция вернет путь до указанного файла за исключением символа оканчания строки и заполнит символьный буффер путем до файла. Как видите вызываем функцию в теле цикла дважды с целью сначала получить размер буфера, а потом уже записать в него путь до файла, не забудьте что функция возвращает только количество символов без нуль байта, поэтому мы и увеличиваем значение буфера на единицу.
- ZeroMemory - это больше прихоть я зануляю буфер, в принципе этого можно не делать.
Вот собственно и все минимум того что нужно знать для работы с файлами кинутыми на форму. Если что не ясно велком в коменты.
Оставить комментарий