“лоток” с файлами
От: shestero  
Дата: 10.08.07 15:29
Оценка:
Хочу сделать некое приложение, позволяющее обслуживать некий “лоток” с файлами. По моему замыслу в идеале окно должно делиться вертикально на две части. Как в старых версиях Nero: левая часть – подобие проводника, на которой отражается файловая система; правая часть – файлы, помещённые в лоток. Хочу мышкой файлы перетаскивать туда-сюда ну и через буфер обмена.
Начал делать (MFC, SDI), разделил окно сплитером, но сразу наткнулся на кучу вопросов. Во-первых, как сделать самое простое подобие проводника (или как его включить) в окно слева от плавающего разделителя? Во-вторых, “лоток” я решил сделать на базе CListView. Как сделать, что бы автоматически иконки у всех файлов были такими же, как и в проводнике в данной системе (папок там не планируется)? Сделал пока общую иконку для всех так:
int Cplc_io2View::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    lpCreateStruct->style |= (LVS_ICON | LVS_AUTOARRANGE);

    if (CListView::OnCreate(lpCreateStruct) == -1)
        return -1;

    CListCtrl& theCtrl = GetListCtrl();

    ilistn.Create(32, 32, TRUE, 1, 1);
    ilistn.Add(AfxGetApp()->LoadIcon(IDR_plc_io2TYPE));
    ASSERT(theCtrl.GetImageList(LVSIL_NORMAL)==NULL);
    theCtrl.SetImageList(&ilistn, LVSIL_NORMAL);
    
    ilists.Create(16, 16, TRUE, 1, 1);
    ilists.Add(AfxGetApp()->LoadIcon(IDR_plc_io2TYPE));
    ASSERT(theCtrl.GetImageList(LVSIL_SMALL)==NULL);
    theCtrl.SetImageList(&ilists, LVSIL_SMALL);

    ASSERT(theCtrl.GetImageList(LVSIL_STATE)==NULL);
    theCtrl.SetImageList(&ilists, LVSIL_STATE);            // ?

    return 0;
}
Иконка появилась как надо в режимах “Lage icons” и “Details”. В режиме “Small icons” иконка нужного размера, но item-ы (называния файлов) почему-то капитально наезжают друг на друга (между ними смещение всего несколько пикселей!), а в режиме отображения “List” почему-то вообще ничего не видно!
Ещё я никогда не делал настоящий drag-n-drop. Не знаю с чего начать.
Re: “лоток” с файлами
От: Gavrus Беларусь  
Дата: 10.08.07 15:40
Оценка:
Исправлено форматирование текста. — SchweinDeBurg

Здравствуйте, 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);

Должно помочь
Re[2]: “лоток” с файлами
От: shestero  
Дата: 13.08.07 10:26
Оценка:
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 как был мёртвый так и остаётся.
Re[3]: “лоток” с файлами
От: shestero  
Дата: 13.08.07 15:08
Оценка:
Я нашёл способ "затаскивания" файлов в мой список — перекрыл OnDropFiles.
Подскажите, как сделать "утаскивание" "файлов" в другие окна из моего списка??
Re[4]: “лоток” с файлами
От: programmater  
Дата: 14.08.07 08:55
Оценка:
Здравствуйте, shestero, Вы писали:

S>Я нашёл способ "затаскивания" файлов в мой список — перекрыл OnDropFiles.

S>Подскажите, как сделать "утаскивание" "файлов" в другие окна из моего списка??
Если "утаскивать" достаточно только в папочки на _твоем_ проводнике (т.е. панельке слева), то просто. Делаешь "самодельный drag-drop".
Если же нужно "по-настоящему" (что бы и в другие приложения можно было файлы кидать) — то на порядок сложнее. Поэтому вопрос — действительно ли тебе это настолько необходимо? Если ответ все же "да" (подожди, а ты хорошо подумал?) — то копай в сторону DoDragDrop, IDropSource, IDataObject. Удачи.
Re[5]: “лоток” с файлами
От: shestero  
Дата: 14.08.07 16:31
Оценка:
S>>Я нашёл способ "затаскивания" файлов в мой список — перекрыл OnDropFiles.
S>>Подскажите, как сделать "утаскивание" "файлов" в другие окна из моего списка??
P>Если "утаскивать" достаточно только в папочки на _твоем_ проводнике (т.е. панельке слева), то просто. Делаешь "самодельный drag-drop".
P>Если же нужно "по-настоящему" (что бы и в другие приложения можно было файлы кидать) — то на порядок сложнее. Поэтому вопрос — действительно ли тебе это настолько необходимо? Если ответ все же "да" (подожди, а ты хорошо подумал?)...
Спасибо, то то что нужно.
Если там и будет проводник, то это должен быть "внедрённый" настоящий проводник (кстати, так и не ясно как его туда засунуть, если это вообще можно). Поэтому "самодельный drag-drop", видимо отпадает.
По вашему тону выходит это довольно гиморно. Можно ли как-нибудь упростить дело используя какие-нибудь классы-обёртки или сторонние бесплатные ненавороченные библиотеки классов?
А что такое COleDataObject, COleDropSource ?
Нужно ли мне включить поддержку ATL в проект?
Есть ли где в сети пошаговый пример?
Занесение и вынесения файлов через буфер обмена мне то же надо сделать.

"Висит" вопрос как сделать что бы у файлов были "правильные" иконки.
Re[6]: “лоток” с файлами
От: programmater  
Дата: 15.08.07 07:55
Оценка:
Здравствуйте, shestero, Вы писали:

S>Спасибо, то то что нужно.

S>Если там и будет проводник, то это должен быть "внедрённый" настоящий проводник (кстати, так и не ясно как его туда засунуть, если это вообще можно). Поэтому "самодельный drag-drop", видимо отпадает.
S>По вашему тону выходит это довольно гиморно.
Скажем так, это _намного_ сдожнее, чем перекрыть OnDropFiles.
S>Можно ли как-нибудь упростить дело используя какие-нибудь классы-обёртки или сторонние бесплатные ненавороченные библиотеки классов?
S>А что такое COleDataObject, COleDropSource ?
S>Нужно ли мне включить поддержку ATL в проект?
S>Есть ли где в сети пошаговый пример?
Не знаю. У меня спросили "сделаешь за день?". Я почитал про DoDragDrop, IDropSource и IDataObject и сказал "нет". На этом мое знакомство с настоящим драг-дропом кончилось. Так что если очень надо — ты пробуй. Когда сделаешь напишешь что получилось .
S>Занесение и вынесения файлов через буфер обмена мне то же надо сделать.

S>"Висит" вопрос как сделать что бы у файлов были "правильные" иконки.

Читай про
WINSHELLAPI DWORD WINAPI SHGetFileInfo(
  LPCTSTR pszPath, 
  DWORD dwFileAttributes, 
  SHFILEINFO FAR* psfi, 
  UINT cbFileInfo, 
  UINT uFlags 
);

использовать можно так:

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-е.

Удачи.
Re[7]: “лоток” с файлами
От: shestero  
Дата: 15.08.07 11:50
Оценка:
Удалено избыточное цитирование. — SchweinDeBurg

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" работают как надо.
Re: “лоток” с файлами
От: bnk СССР http://unmanagedvisio.com/
Дата: 16.08.07 13:53
Оценка:
Если не секрет, что за термин такой — "лоток"?
Причем тут какие-то "лотки"? Или это от "Nero"?


Просто любопытно, что ваша программулина делать-то должна?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.