Хочу сделать некое приложение, позволяющее обслуживать некий “лоток” с файлами. По моему замыслу в идеале окно должно делиться вертикально на две части. Как в старых версиях Nero: левая часть – подобие проводника, на которой отражается файловая система; правая часть – файлы, помещённые в лоток. Хочу мышкой файлы перетаскивать туда-сюда ну и через буфер обмена.
Начал делать (MFC, SDI), разделил окно сплитером, но сразу наткнулся на кучу вопросов. Во-первых, как сделать самое простое подобие проводника (или как его включить) в окно слева от плавающего разделителя? Во-вторых, “лоток” я решил сделать на базе CListView. Как сделать, что бы автоматически иконки у всех файлов были такими же, как и в проводнике в данной системе (папок там не планируется)? Сделал пока общую иконку для всех так:
Иконка появилась как надо в режимах “Lage icons” и “Details”. В режиме “Small icons” иконка нужного размера, но item-ы (называния файлов) почему-то капитально наезжают друг на друга (между ними смещение всего несколько пикселей!), а в режиме отображения “List” почему-то вообще ничего не видно!
Ещё я никогда не делал настоящий drag-n-drop. Не знаю с чего начать.
Здравствуйте, shestero, Вы писали:
S>}[/ccode]Иконка появилась как надо в режимах “Lage icons” и “Details”. В режиме “Small icons” иконка нужного размера, но item-ы (называния файлов) почему-то капитально наезжают друг на друга (между ними смещение всего несколько пикселей!), а в режиме отображения “List” почему-то вообще ничего не видно! S>Ещё я никогда не делал настоящий drag-n-drop. Не знаю с чего начать.
Пробуй:
BOOL SetColumnWidth(int col_num, LVSCW_AUTOSIZE);
CSize SetIconSpacing(int cx, int cy);
G>Пробуй: G>BOOL SetColumnWidth(int col_num, LVSCW_AUTOSIZE); G>CSize SetIconSpacing(int cx, int cy); G>Должно помочь
Всё это — не главная часть моих вопросов.
Однако не помогает.
SetColumnWidth ведь управляет шириной колонок в режиме списка (details) а с ним всё в порядке.
у меня тамстояло LVSCW_AUTOSIZE_USEHEADER. Ширину колонки я здаю в заголовке col.cx = 200;
SetIconSpacing только портит основной крупный иконочный режим (а с ним всё в порядке).
Мелкий иконочный режим как был кривой так и остаётся.
Режим list как был мёртвый так и остаётся.
Я нашёл способ "затаскивания" файлов в мой список — перекрыл OnDropFiles.
Подскажите, как сделать "утаскивание" "файлов" в другие окна из моего списка??
Здравствуйте, shestero, Вы писали:
S>Я нашёл способ "затаскивания" файлов в мой список — перекрыл OnDropFiles. S>Подскажите, как сделать "утаскивание" "файлов" в другие окна из моего списка??
Если "утаскивать" достаточно только в папочки на _твоем_ проводнике (т.е. панельке слева), то просто. Делаешь "самодельный drag-drop".
Если же нужно "по-настоящему" (что бы и в другие приложения можно было файлы кидать) — то на порядок сложнее. Поэтому вопрос — действительно ли тебе это настолько необходимо? Если ответ все же "да" (подожди, а ты хорошо подумал?) — то копай в сторону DoDragDrop, IDropSource, IDataObject. Удачи.
S>>Я нашёл способ "затаскивания" файлов в мой список — перекрыл OnDropFiles. S>>Подскажите, как сделать "утаскивание" "файлов" в другие окна из моего списка?? P>Если "утаскивать" достаточно только в папочки на _твоем_ проводнике (т.е. панельке слева), то просто. Делаешь "самодельный drag-drop". P>Если же нужно "по-настоящему" (что бы и в другие приложения можно было файлы кидать) — то на порядок сложнее. Поэтому вопрос — действительно ли тебе это настолько необходимо? Если ответ все же "да" (подожди, а ты хорошо подумал?)...
Спасибо, то то что нужно.
Если там и будет проводник, то это должен быть "внедрённый" настоящий проводник (кстати, так и не ясно как его туда засунуть, если это вообще можно). Поэтому "самодельный drag-drop", видимо отпадает.
По вашему тону выходит это довольно гиморно. Можно ли как-нибудь упростить дело используя какие-нибудь классы-обёртки или сторонние бесплатные ненавороченные библиотеки классов?
А что такое COleDataObject, COleDropSource ?
Нужно ли мне включить поддержку ATL в проект?
Есть ли где в сети пошаговый пример?
Занесение и вынесения файлов через буфер обмена мне то же надо сделать.
"Висит" вопрос как сделать что бы у файлов были "правильные" иконки.
Здравствуйте, shestero, Вы писали:
S>Спасибо, то то что нужно. S>Если там и будет проводник, то это должен быть "внедрённый" настоящий проводник (кстати, так и не ясно как его туда засунуть, если это вообще можно). Поэтому "самодельный drag-drop", видимо отпадает. S>По вашему тону выходит это довольно гиморно.
Скажем так, это _намного_ сдожнее, чем перекрыть OnDropFiles. S>Можно ли как-нибудь упростить дело используя какие-нибудь классы-обёртки или сторонние бесплатные ненавороченные библиотеки классов? S>А что такое COleDataObject, COleDropSource ? S>Нужно ли мне включить поддержку ATL в проект? S>Есть ли где в сети пошаговый пример?
Не знаю. У меня спросили "сделаешь за день?". Я почитал про DoDragDrop, IDropSource и IDataObject и сказал "нет". На этом мое знакомство с настоящим драг-дропом кончилось. Так что если очень надо — ты пробуй. Когда сделаешь напишешь что получилось . S>Занесение и вынесения файлов через буфер обмена мне то же надо сделать.
S>"Висит" вопрос как сделать что бы у файлов были "правильные" иконки.
Читай про
SHFILEINFO s_sfiLarge;
HIMAGELIST s_himlLarge = (HIMAGELIST)SHGetFileInfo(szFileName, 0, &s_sfiLarge, sizeof(s_sfiLarge), SHGFI_SYSICONINDEX|SHGFI_LARGEICON);
// После этого s_sfiLargeSelected.iIcon будет содержать индекс иконки в s_himlLarge для интересующего тебя файла.
// Как затолкать это в твой визуальный контрол (ListView?) уж разберись сам.
// Возможно придется юзать ListView in Virtual mode (LVS_OWNERDATA), поскольку я как-то нарвался на такой эффект, что
// System Image List менялся как хотел, и полагаться на то, что индекс иконки будет неизменным можно не всегда.
// Т.е. возможно придется запрашивать эту информацию при каждом Paint-е.
S>>Занесение и вынесения файлов через буфер обмена мне то же надо сделать.
Возможно, drag-n-drop файлов не так страшен, как кажется.
Я воспользовался описаниями примерами: http://www.ucancode.net/faq/MFC-Drag-Drop-Cut-Copy-Paste.htm http://www.codeguru.com/cpp/controls/listbox/dragdrop/print.php/c11069/
и в течении 2 часов сделал заготовок для передачи файлов drag-n-drop-ом и через буфер обмена (приём файлов drag-n-drop-ом оставил как уже сделал через "тупой" OnDropFiles).
Возникла небольшая проблемка: OnDropFiles стал реагировать на перетаскивание иконок внутри окна (что он не должен делать вообще) точно так же как и на зтаскивание их из вне. Можно ли как-нибудь с этим побороться?
*** Основной мойвопрос сейчас: как втыкнть"настоящий" проводник мне в окно слва от разделителя?
По прежнему не понятно, почему один из четырёх режимов отображения списка работает криво, а ещё один вообще ничего не показывает ("list"). Режимы "Large Icons" и "Details" работают как надо.