Название: Как сделать Drag-n-Drop самому без SetCapture? Отправлено: Caduceus от Октябрь 26, 2009, 12:29 У меня есть Qt-шный QGraphicsView и есть нативное Win-окно - дочернее к основному Qt-ному - то есть как бы и виджет и нативное окно - это контролы внутри основного окна. Мне надо сделать Drag-n-Drop из QGraphicsView в мое нативное окно. То есть как бы понятно,Ж что там надо обработать захват, потом ловить MouseMove в нативном окне и MouseUp в нативном окне. Проблема в том, что видимо QGraphicsView автоматом делает SetCapture и если я начинаю стаскивать объект с QGraphicsView и веду мышкой надо нативным окном, то туда не приходят MouseMove
Как заставить QGraphicsView не делать захват мыши? Название: Re: Как сделать Drag-n-Drop самому без SetCapture? Отправлено: Caduceus от Октябрь 27, 2009, 09:36 м-м-м, судя по наплыву отвечающих, вопрос не был понят.
Переформулирую - как сделать Drag-n-Drop из Qt-шного виджета в обычное WinAPI окно? Название: Re: Как сделать Drag-n-Drop самому без SetCapture? Отправлено: shadone от Октябрь 27, 2009, 13:30 м-м-м, судя по наплыву отвечающих, вопрос не был понят. mouse press / mouse move не являются механизмом Drag-n-Drop - для него существует отдельный "протокол". Все что нужно сделать со стороны Qt - это начать drag создав объект QDrag (http://doc.qt.nokia.com/4.6-snapshot/qdrag.html). см документаицю по Drag-and-Drop (http://doc.qt.nokia.com/4.6-snapshot/dnd.html).Переформулирую - как сделать Drag-n-Drop из Qt-шного виджета в обычное WinAPI окно? На стороне родного Win окна нужно разрешить drop. См документацию по RegisterDragDrop (http://msdn.microsoft.com/en-us/library/ms678405(VS.85).aspx) Название: Re: Как сделать Drag-n-Drop самому без SetCapture? Отправлено: SABROG от Октябрь 27, 2009, 14:59 Вроде бы всё работает:
Код
Код
Хватаем мышой квадратик и тащим на рабочий стол. На нем должна появится копия exe'шника программы. Т.е. никакие setCapture не мешают. Название: Re: Как сделать Drag-n-Drop самому без SetCapture? Отправлено: Caduceus от Ноябрь 02, 2009, 23:16 Единственный правльный вариант видимо через реализацию IDropTarget и RegisterDragDrop для нативного окна. Всяко перепробовал - никак не работает. Черт. Если регистрирую свой IDropTarget и тащу из виджета в это окно, то вообще вся прога падает. В функции IDropTarget-а не заходит... :(
Кто-нить может ткнуть в пример чистой реализации IDropTarget и RegisterDragDrop без всяких MFC ? Название: Re: Как сделать Drag-n-Drop самому без SetCapture? Отправлено: shadone от Ноябрь 02, 2009, 23:31 Единственный правльный вариант видимо через реализацию IDropTarget и RegisterDragDrop для нативного окна. Всяко перепробовал - никак не работает. Черт. Если регистрирую свой IDropTarget и тащу из виджета в это окно, то вообще вся прога падает. В функции IDropTarget-а не заходит... :( http://qt.gitorious.org/qt/qt/blobs/4.6/src/gui/kernel/qdnd_p.h#line283 and http://qt.gitorious.org/qt/qt/blobs/4.6/src/gui/kernel/qdnd_win.cpp :)Кто-нить может ткнуть в пример чистой реализации IDropTarget и RegisterDragDrop без всяких MFC ? Название: Re: Как сделать Drag-n-Drop самому без SetCapture? Отправлено: Caduceus от Ноябрь 02, 2009, 23:37 Черт. Так ведь и делаю. Вот заделал такой класс:
Код: class MyTarget: public IDropTarget Создал глобальный объект этого класса: Код: static MyTarget drop_target; Регистрю для моего нативного окна вот так: Код: HRESULT hr; hr всегда S_OK И ничего. Виснет программа когда пытюсь стащить что-то в нативное окно... :((( Ни в одну функцию класса MyTarget кроме AddRef и конструктора не заходит... |