| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Звук, графика и видео > Рисование поверх других окон |
| Автор: murod 14.7.2007, 13:37 | ||||
| Всем Привет! Такая вот задача: Надо сделать програмку типа Paint. Но он будет рисовать на рабочем столе или поверх других окон. Сама Программа занимает верхную область рабочего стола. Там будет только панель инструментов(тип линии, цвет заливки, Ластик, квадрат...). Рисовать получается. Но вот, как очистить определенную область, например маленкий квадрат? Как сделать Ластик как на Paint. Ясно что на Paint нету заднего фона там можно просто очишать белым или рисовать белый квадрат. А как поступить в моем случаи? Ведь у меня задний фон не белый а там стоит рабочий стол. Первое в голову приходит как то обновить маленький регион рабочего стола. Но не получается. Когда обнавляю регион вместо него рисуется белый квадрат. Здесь запутался, дальше не идет. Посоветуйте хоть что. рисую примерно так:
стираю так:
Заранее всем спасибо. |
| Автор: Alexeis 14.7.2007, 23:54 |
| А почему бы не стирать просто рисуя белый квадратик? |
| Автор: nmn 15.7.2007, 00:22 |
| а как ты собираешься стирать? восстанавливать то что было раньше? тогда можешь сделать себе фотографию экрана и потом из нее восстанавливать "испорченный" участок Добавлено через 1 минуту и 49 секунд и еще IvalidateRect необходимо передавать не дескриптор контекста а дескриптор окна |
| Автор: murod 15.7.2007, 19:51 | ||||
| Alexeis, если буду стирать белым квадратиком то у меня задний фоном является рабочий стол, мне надо очистить только то что нарисовал. И при этом задним фоном должно быть рабочий стол. По проше у меня как бы два слоя. 1-слой это рабочий стол. 2-слой это то что я рисую. Если смогу обновить прямоугольную область экрана то у меня 2-слой отстирается а 1-слой обновится(windows автоматически перерисует прямоугольную область экрана) вот тогда бы получился ластик. nmn,
Это для частных случаев может подойдет, когда у меня статический обычны рабочий стол. Если на рабочем столе будет проигрыватся видео файл(Media player) то тогда я не смогу правильно обновить экран. Мне просто нужна функция обновления указанной области экрана, типа IvalidateRect().
это действительно может помочь. я не правильно обновлял. Попробую IvalidateRect() передать хендл окна под указателем мышки а не контекст устройства. |
| Автор: murod 15.7.2007, 20:14 | ||
| нет неработает, не обновляется. Я поставил ловушку на мыш. обрабатываю события мыши и поним рисую, стираю. вот код ловушки и как стираю.
Посмотрите может еще где делаю не правильно, |
| Автор: nmn 17.7.2007, 03:17 |
| вроде InvalidateRect не вызывает перерисовки, а только при добавляет к перерисовываемой области прямоугольник Добавлено через 5 минут и 14 секунд а если окно не перекрывается другими окнами и не выходит за пределы экрана то и сообщение WM_PAINT не присылается, отсюда вывод - шли сам или вызывай UpdateWindow. Может проще сделать фотографию и рисовать на ней? |
| Автор: bems 17.7.2007, 17:46 |
| попробуй рисовать на прозрачном слоистом окне во весь экран |
| Автор: murod 17.7.2007, 20:43 |
| bems, можно подробней ? если не трудно, приведи маленький пример. |
| Автор: bems 18.7.2007, 11:43 | ||
вот примерчик
Добавлено через 4 минуты и 2 секунды недостатки: - окно иногда "проваливается" под панель задач (но в большей части экрана все в порядке) - рисовать можно не всеми цветами (т. к. один зарезервирован под прозрачность) |
| Автор: murod 19.7.2007, 06:39 |
| bems, Спасибо большое. Так и буду делать. Только как то мне надо будет чтобы этот окно стояла поверх Панели задач, что бы не проваливался. Этим думаю можно разобратся. |