Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > 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 |
Если быть точным то CImageList. Зачем тогда задаешь вопрос в ветке MFC ? Используй тогда IImageList и его методы, там много интересного. |
Автор: Svia 1.6.2009, 12:31 | ||
Может я не туда смотрю, но у меня на экране название подфорума "Форум -> Программирование -> C++ -> C/C++: Системное программирование и WinAPI (еще)". Где там слово "MFC"? Про IImageList нашел. На крайний случай, конечно, попробую использовать его. Думаю, что есть что-то простое, не столь навороченное как список картинок. К тому же, судя по отзывам в инете очень он неважно работает с перетаскивание картинок "нестандартного размера". |
Автор: Earnest 2.6.2009, 07:39 | ||
Это я вчера перенесла, так что не очень-то, правильно тебе замечание сделали. ![]() Если под "нестандартным размером" имеется в виду просто большие картинки, а "неважно" - это "медленно", то да, 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]
Тут проблема в динамике перемещения. Картинка будет замещать курсор, т.е должна двигаться достаточно быстро - почти так же быстро как простая стрелка. |
Автор: Earnest 2.6.2009, 16:16 |
Создавать курсор 400*400 - это, конечно, слишком... А вот насчет DragImage - не думаю, что сильно тормозить будет. А если будет, то рисуй сам: совместимый контекст в памяти, скопировать туда картинку, при перемещении мышки восстановить изображение на стором месте и нарисовать на новом (запомнив, что было). Все через BitBlt. |
Автор: Svia 2.6.2009, 16:20 |
Суть-то понятна. Хочется, чего-то легкого, что бы клиппингом областей не заморачиваться, вроде как дернул за OnDraw разик, он вообще всё перерисовал. |