Drag & Drop в другое приложение
От: ionicman  
Дата: 26.12.06 09:30
Оценка:
Вот вопрос у меня к guru. Хочется мне сделать Drop файлов из моего приложения в проводник. что делую:

Входные параметры wnd — окно куда бросать, pt — координаты точки "сброса", sFiles — тестовые строки разделенные нулем типа "c:\\1.txt\x00c:\\2.txt\x00\x00".

Так вот не работает, к сожелению. Я знаю что дроп такто через COM. Но вроде бы говорят что можно и без него.

Подскажите, кто знает. Или хотябы можно ли сделать это на простом API?
Заранее спасибо!

void DropTo(HWND wnd, POINT pt, char *sFiles) {
DROPFILES dobj={ 20, { pt.x, pt.y }, 0, 1 };
int nLen=0;
while (sFiles[nLen]!=0 || sFiles[nLen+1]!=0) nLen++;
nLen+=2;

int nGblLen=sizeof(dobj) + nLen*2 + 5;
HGLOBAL hGbl=GlobalAlloc(GMEM_ZEROINIT|GMEM_MOVEABLE|GMEM_DDESHARE, nGblLen);
BYTE *sData=(BYTE *)GlobalLock(hGbl);
CopyMemory(sData, (BYTE *)&dobj, sizeof(dobj) );

char *sWStr=(char *)sData+sizeof(dobj);
DWORD i=0,j=i;
while (TRUE) {
       if (sFiles[i]==0) {
           MultiByteToWideChar(CP_ACP,0,(char *)(sFiles+j),-1,(LPWSTR)(sWStr+j*2),MAX_PATH);
           j=i+1;
           if (sFiles[j]==0) break;
       }
       i++;
 }

GlobalUnlock(hGbl);
PostMessage(wnd,WM_DROPFILES,(WPARAM)hGbl,0);
}
Re: Drag & Drop в другое приложение
От: shurik.  
Дата: 27.12.06 09:56
Оценка:
Здравствуйте, ionicman, Вы писали:

I>Так вот не работает, к сожелению. Я знаю что дроп такто через COM. Но вроде бы говорят что можно и без него.


без кома вроде только получать файлы можно (см. WS_EX_ACCEPTFILES)

I>Подскажите, кто знает. Или хотябы можно ли сделать это на простом API?


а чтоб быть источником драгдропа надо заморочиться по полной (см. DoDragDrop) 8)
Re[2]: Drag & Drop в другое приложение
От: programmater  
Дата: 27.12.06 10:09
Оценка:
Здравствуйте, shurik., Вы писали:

S>Здравствуйте, ionicman, Вы писали:


I>>Так вот не работает, к сожелению. Я знаю что дроп такто через COM. Но вроде бы говорят что можно и без него.


S>без кома вроде только получать файлы можно (см. WS_EX_ACCEPTFILES)


I>>Подскажите, кто знает. Или хотябы можно ли сделать это на простом API?


S>а чтоб быть источником драгдропа надо заморочиться по полной (см. DoDragDrop) 8)


У мну проблема сделать драг-дроп исключительно в своем приложении. Мож кто подскажет, как это можно сделать "по-простому". Про ДуДрагДроп (и всех остальных ежей с ней) читал и примерно представляю как это делать, но лома-а-а-а-а-ет!!! Помню где-то видел статью, автор по-моему Пол Дилация, где как раз объясняется, как сделать "самодельный драг-дроп" внутри своего приложения. Но поиском по сайту не нашел. Кстати в этой статье автор называет стандартный драг-дроп для таких задач "стрельбой из пушек по воробьям". Подскажите, как такое сделать или где найти эту статью (или хотя бы что-то похожее).
Re[3]: Drag & Drop в другое приложение
От: shurik.  
Дата: 28.12.06 09:13
Оценка:
Здравствуйте, programmater, Вы писали:

P>Здравствуйте, shurik., Вы писали:


S>>Здравствуйте, ionicman, Вы писали:


I>>>Так вот не работает, к сожелению. Я знаю что дроп такто через COM. Но вроде бы говорят что можно и без него.


S>>без кома вроде только получать файлы можно (см. WS_EX_ACCEPTFILES)


I>>>Подскажите, кто знает. Или хотябы можно ли сделать это на простом API?


S>>а чтоб быть источником драгдропа надо заморочиться по полной (см. DoDragDrop) 8)


P>У мну проблема сделать драг-дроп исключительно в своем приложении. Мож кто подскажет, как это можно сделать "по-простому". Про ДуДрагДроп (и всех остальных ежей с ней) читал и примерно представляю как это делать, но лома-а-а-а-а-ет!!! Помню где-то видел статью, автор по-моему Пол Дилация, где как раз объясняется, как сделать "самодельный драг-дроп" внутри своего приложения. Но поиском по сайту не нашел. Кстати в этой статье автор называет стандартный драг-дроп для таких задач "стрельбой из пушек по воробьям". Подскажите, как такое сделать или где найти эту статью (или хотя бы что-то похожее).


Думаю "по-простому" имеется ввиду примерно так

case WM_LBUTTONDOWN:
    SetCapture(m_hWnd);
    // запоминаем что тащим и меняем курсор
case WM_MOUSEMOVE:
    // ...
case WM_LBUTTONUP:
    ReleaseCapture();
    // вспоминаем что тащим и делаем что надо


это конечно ооочень примерно, но я мысль мне пришла такая первая 8)

Только подумайте вот о чём — люди писавшие стандартный драгдроп уже обо всех проблемах подумали и найденные исправили
а вот вы с самопальным 100% огребёте кучу проблем 8) и скорей всего на их решение уйдёт больше времени чем на понимание работы и реализацию стандартного драгдропа и часть проблем после этого всё равно может остаться.

Я бы не поленился и изучил, может либы какие поискал, всё равно ведь пригодится. Куда ж в 21 веке без драгдропа 8)
Re[4]: Drag & Drop в другое приложение
От: ionicman  
Дата: 28.12.06 16:45
Оценка:
S>Только подумайте вот о чём — люди писавшие стандартный драгдроп уже обо всех проблемах подумали и найденные исправили
S>а вот вы с самопальным 100% огребёте кучу проблем 8) и скорей всего на их решение уйдёт больше времени чем на понимание работы и реализацию стандартного драгдропа и часть проблем после этого всё равно может остаться.

S>Я бы не поленился и изучил, может либы какие поискал, всё равно ведь пригодится. Куда ж в 21 веке без драгдропа 8)



Да я бы с удовольствием и через COM — примеры есть как его запустить. Но мне надо просто бросить уже готовый список в приложение. иными словами HWND у меня уже есть. если надо через COM -запросто — но только подскажите как.
Re[5]: Drag & Drop в другое приложение
От: AndrewJD США  
Дата: 29.12.06 11:58
Оценка:
Здравствуйте, ionicman, Вы писали:

I>Да я бы с удовольствием и через COM — примеры есть как его запустить. Но мне надо просто бросить уже готовый список в приложение. иными словами HWND у меня уже есть. если надо через COM -запросто — но только подскажите как.


На codeproject.com есть масса примеров
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Re: Drag & Drop в другое приложение
От: ionicman  
Дата: 31.12.06 13:26
Оценка:
К Сожелению там нет по файлам вообще ничего. А вот про другие типы дропа действительно много.
Re: Drag & Drop в другое приложение
От: ionicman  
Дата: 31.12.06 13:58
Оценка:
Вобщем вопрос все еще открыт. Как послать приложению список файлов? Уже свормированный? Запросить у окна IDropTarget и вызвать Drop пробовал — умирает. Проблема с использованием DoDragDrop — почему не могу использовать — потому что у меня drag начитается по правой клавише, а придурошная винда считает что завершение драга всегда по левой клавише. Если кто желала чтонидь — поделитесь — link или сорец даже без объяснений вполне подойдутю спасибо большое заранее
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.