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


Автор: Svia 30.5.2009, 02:46
Есть HDC, на нем что-то нарисовано.
Есть совместимый с ним DC. На нем, допустим, нарисован прямоугольник.
Хочется заместить курсор мыши на то, что лежит во втором DC. Из файла читать нельзя - изображение курсора может обновляться.
Разумеется, отрисовка должна вестись верно, с сохранением фона, и затиранием следов курсора.

Автор: Earnest 30.5.2009, 19:22
Посмотри в сторону функций ImageList: DragEnter, DragLeave, DragMove

Автор: Svia 30.5.2009, 23:01
Что такое  ImageList? MFC не использую, чистый winapi, и вообще такого класса кроме как в дотнете нет.

Автор: Andrey44 1.6.2009, 07:16
Цитата(Svia @  30.5.2009,  23:01 Найти цитируемый пост)
Что такое  ImageList?

Если быть точным то CImageList.

Цитата(Svia @  30.5.2009,  23:01 Найти цитируемый пост)
MFC не использую, чистый winapi

Зачем тогда задаешь вопрос в ветке MFC ?

Используй тогда IImageList и его методы, там много интересного.

Автор: Svia 1.6.2009, 12:31
Цитата(Andrey44 @ 1.6.2009,  07:16)
Цитата(Svia @  30.5.2009,  23:01 Найти цитируемый пост)
Что такое  ImageList?

Если быть точным то CImageList.

Цитата(Svia @  30.5.2009,  23:01 Найти цитируемый пост)
MFC не использую, чистый winapi

Зачем тогда задаешь вопрос в ветке MFC ?

Используй тогда IImageList и его методы, там много интересного.

Может я не туда смотрю, но у меня на экране название подфорума "Форум -> Программирование -> C++ -> C/C++: Системное программирование и WinAPI (еще)". Где там слово "MFC"?

Про IImageList нашел. На крайний случай, конечно, попробую использовать его. Думаю, что есть что-то простое, не столь навороченное как список картинок. К тому же, судя по отзывам в инете очень он неважно работает с перетаскивание картинок "нестандартного размера".

Автор: Andrey44 1.6.2009, 14:32
Цитата(Svia @  1.6.2009,  12:31 Найти цитируемый пост)
Может я не туда смотрю, но у меня на экране название подфорума "Форум -> Программирование -> C++ -> C/C++: Системное программирование и WinAPI (еще)". Где там слово "MFC"?

Извиняюсь, наверное не проснулся утром smile 
Цитата(Svia @  1.6.2009,  12:31 Найти цитируемый пост)
К тому же, судя по отзывам в инете очень он неважно работает с перетаскивание картинок "нестандартного размера". 

Можно ссылку где такое прочитали?

Автор: Earnest 2.6.2009, 07:39
Цитата(Svia @  1.6.2009,  13:31 Найти цитируемый пост)
Может я не туда смотрю, но у меня на экране название подфорума "Форум -> Программирование -> C++ -> C/C++: Системное программирование и WinAPI (еще)".

Это я вчера перенесла, так что не очень-то, правильно тебе замечание сделали. smile 
Если под "нестандартным размером" имеется в виду просто большие картинки, а "неважно" - это "медленно", то да, GDI+ вообще не чемпион по скорости.

Насчет ImageList: есть, конечно и MFC-оболочка, но вообще-то это набор функций АПИ: ImageList_EndDrag etc. Ничего навороченного в списке картинок нет. Если будешь рисовать сам - примерно тоже самое придется написать руками. Другое дело, если у тебя действительно большая картинка. Но тогда нужно определиться, как именно ты ее хочешь таскать...

Автор: Svia 2.6.2009, 10:49
Я собрал приложение для этого проверки. Да, попробую использовать методы указанного интерфейса.
Таскаться могу рисунки вплоть до 400х400 точек.

На деле мне вообще надо таскать что-то нарисованное на канве cairo и под виндой (чего ради и искал) и под маком (ладно жоть не мне портировать). Но, к сожалению, любителей кайры тут не столь много =).
Потому и искал максимально кроссплатформенное решение. Ну что-то вроде "тебе надо сделат две маски и заюзать CreateCursor". Т.е. некую функцию, которую проще будет спортировать чем весь commctl32.dll.

To Andrey44: Как второй вариант (еще не пробовал)  использую упомянутый CreateCursor (ну ооочень лень маски на ходу делать =)), но (тут я напутал) именно он хреново работает с курсорами нестандартных размеров (первая ссылка по createcursor c++ big size)

Так что для винды, думаю, решение можно считать найденным. По-крайней мере это кажется меньшим из зол

Добавлено @ 10:51
[QUOTE=Earnest,2.6.2009,  07:39]
Цитата(Svia @  1.6.2009,  13:31 Найти цитируемый пост)

Насчет ImageList: есть, конечно и MFC-оболочка, но вообще-то это набор функций АПИ: ImageList_EndDrag etc. Ничего навороченного в списке картинок нет. Если будешь рисовать сам - примерно тоже самое придется написать руками. Другое дело, если у тебя действительно большая картинка. Но тогда нужно определиться, как именно ты ее хочешь таскать...

Тут проблема в динамике перемещения. Картинка будет замещать курсор, т.е должна двигаться достаточно быстро - почти так же быстро как простая стрелка.

Автор: Earnest 2.6.2009, 16:16
Создавать курсор 400*400 - это, конечно, слишком... А вот насчет DragImage - не думаю, что сильно тормозить будет. А если будет, то рисуй сам: совместимый контекст в памяти, скопировать туда картинку,
при перемещении мышки восстановить изображение на стором месте и нарисовать на новом (запомнив, что было). Все через BitBlt. 

Автор: Svia 2.6.2009, 16:20
Суть-то понятна. Хочется, чего-то легкого, что бы клиппингом областей не заморачиваться, вроде как дернул за OnDraw разик, он вообще всё перерисовал.

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