Немного о Drag&Drop WinAPI

Март 16th, 2011 § 0 comments

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 - это больше прихоть я зануляю буфер, в принципе этого можно не делать.

Вот собственно и все минимум того что нужно знать для работы с файлами кинутыми на форму. Если что не ясно велком в коменты.

Оставить комментарий

Ваш email не будет опубликован. Обязательные поля отмечены *

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Смотреть фильмы онлайн