Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Drag and Drop


Автор: Toohtik 1.12.2006, 20:38
Есть окошко. Надо чтоб при бросании на него файла определялось месторасположение файла. Достаточно ли трудно это делать?  Есть ли какянибудь литература на эту тему?

Автор: rsm 2.12.2006, 00:52
Функции DragAcceptFiles и DragQueryFile тебе в помощь. Код простой, в несколько строчек.

Автор: Toohtik 2.12.2006, 01:30
Цитата

Функции DragAcceptFiles и DragQueryFile тебе в помощь. Код простой, в несколько строчек.


Слышал про них, но там где я читал указывалось что надо еще вектор прерываний строить... 

rsm, ты кстати первый говориш что это легко сделать, это меня и сильно смущало...

Автор: rsm 2.12.2006, 02:03
Цитата(Toohtik @  2.12.2006,  03:30 Найти цитируемый пост)
надо еще вектор прерываний строить...
 smile Не путай DOS с Windows.

Цитата(Toohtik @  2.12.2006,  03:30 Найти цитируемый пост)
ты кстати первый говориш что это легко сделать
Потому что это действительно легко сделать, в аттаче пример.

Автор: Toohtik 3.12.2006, 22:33
Вроде все легко и в премере разобрался но не могу понять что значит в 
Код
DragQueryFile((HDROP) wParam, i, szFileName, MAX_PATH);
 
(HDROP) wParam? В MSDN написано, что 
Цитата

hDrop
Identifier of the structure containing the file names of the dropped files. 

Т.е. должна быть структура?

Автор: rsm 4.12.2006, 15:31
Цитата(Toohtik @  4.12.2006,  00:33 Найти цитируемый пост)
Т.е. должна быть структура?
Просто переведи и все станет ясно: Identifier of the structure containing the file names of the dropped files = Идентификатор структуры, содержащей имена "брошенных" файлов.

Автор: Emura 4.6.2009, 00:03
автор топика задал вопрос о drag&drop относительно файлов, хотелось бы услышать что-нибудь относительно объектов.

понял что надо смотреть на DragObject, но этой функции даже в справке нет.

спасибо.
ps. drag&drop в рамках одного процесса.

провел эксперимент с одним окном

Код

// отправляем данные
        int gg=88;
        DragObject(hwnd, hwnd, 0, (ULONG_PTR)&gg, 0);


// а вот так получаем
// получаем данные по сообщению 0x022B, отлавливал на угад 
// приходит еще 0x022D, что оно значит не понял, описания не нашел

        DROPSTRUCT *info =(DROPSTRUCT*)lParam;
        int g=*(int*)info->dwData;


самое удивительное что сработало!  но что-то мне подсказывает что чтото здесь не так smile






Автор: GremlinProg 4.6.2009, 00:37
Цитата(Emura @  4.6.2009,  02:03 Найти цитируемый пост)
автор топика задал вопрос о drag&drop относительно файлов, хотелось бы услышать что-нибудь относительно объектов.

каких объектов?
что-то конкретное, или вообще, любая информация?

Цитата(Emura @  4.6.2009,  02:03 Найти цитируемый пост)

...
DragObject
...
DROPSTRUCT *info
...

это из какой оперы?

управляемый перенос чего-либо осуществляется через интерыейс захвата мыши: SetCapture, ReleaseCapture
на событиях WM_LBUTTONDOWN, WM_MOUSEMOVE, WM_LBUTTONUP
в режиме захвата, инициатор переноса (источник) получает все сообщения мыши, поэтому всегда можно проконтролировать куда был "опущен" объект при переносе (определить приемник), и сделать необходимые действия в цепочке "источник -> приемник"

Автор: Emura 4.6.2009, 01:10
Цитата

каких объектов?
что-то конкретное, или вообще, любая информация?



да хотябы указатель. наверное с ним универсальней будет. а пробовал вот с интом.


Цитата

это из какой оперы?


winuser.h smile
чуть повыше объявления этих функций

Код

#if(WINVER >= 0x0400)
//
// Drag-and-drop support
// Obsolete - use OLE instead
//


Цитата

управляемый перенос чего-либо осуществляется через интерыейс захвата мыши: SetCapture, ReleaseCapture
на событиях WM_LBUTTONDOWN, WM_MOUSEMOVE, WM_LBUTTONUP
в режиме захвата, инициатор переноса (источник) получает все сообщения мыши, поэтому всегда можно проконтролировать куда был "опущен" объект при переносе (определить приемник), и сделать необходимые действия в цепочке "источник -> приемник"


хм.. идея понятна про реализацию спрошу.

например:
есть два окна, расположены на родителе(третьем окне). и надо передать структуру от одного окна другому. следовательно первое окно должно отдавать, а второе принимать. каким образом заставить второе окно в нужный момент среагировать? (если сообщения отсылаются первому) т.е. какова здесь правильная последовательность действий.

Автор: Emura 5.6.2009, 13:06
сделал всетаки этот драгдроп! надо было в пределах своего поцесса поэтому заморачиваться не стал и придумал свою реализацию. отталкивался при создании от совета GremlinProg'а. 

попутный вопрос:
при перемещении мышкой тех же папок под курсором мы видим полупрозрачную иконку "схваченной" папки. как можно реализовать подобный эффект? создавать временное окно под курсором? или есть более рациональное решение?

Автор: GremlinProg 5.6.2009, 13:20
Цитата(Emura @  5.6.2009,  15:06 Найти цитируемый пост)
при перемещении мышкой тех же папок под курсором мы видим полупрозрачную иконку "схваченной" папки. как можно реализовать подобный эффект?

http://www.i2r.ru/static/565/out_17613.shtml
смотри раздел "Опеpации Drag-and-Drop над контpолом tree view"
аналогично, с помощью ImageList'а реализуется механизм в любом окне

недостаток: такой полупрозрачный "курсор" может находиться только в пределах какого-либо окна

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)