Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/25: Рейтинг темы: голосов - 25, средняя оценка - 4.72
17 / 17 / 1
Регистрация: 30.09.2009
Сообщений: 89

Использование CopyRect

21.11.2010, 21:33. Показов 4930. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую. Необходимо реализовать метод спрайтов в программе, реализующей динамическое изображение. Для этого вокруг исходной фигуры (в моем случае - квадрат) рисуется прямогуольная область с цветом фона, т.е. фигура помещается внуть некотрой области, имеющий цвет фона и сливающейся с ним. Далее необходимо поместить эту область с фигурами в буфер, произвести очистку и из буфера берем сохраненную фигуру и выводим ее с новыми координатами. Т.е. нарисовали, сохранили, стерли, изменили координаты, вновь нарисовали. Проблема в том, что не могу придумать способа сохранить фигуру и вновь ее из буфера вывести. Ниже часть программы, которая рисует квадрат белого цвета, вписует в него квадрат меньшего размера. Как сделать копирование этого квадрата с вписанным треугольником и вывод этой части из буфера на очищенный Image1?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void Method_Sprait(int x, int y)
{
  //очистка 
  static TRect rect = TRect (0, 0, Form1->Image2->Width, Form1->Image1->Height);
  Form1->Image1->Canvas->FillRect(rect);
  //рисование белого квадрата
  Form1->Image1->Canvas->Pen->Color = clWhite;
  Form1->Image1->Canvas->Rectangle(x - 10, y - 10, x + 60, y + 60);
  Form1->Image1->Canvas->Pen->Color = clBlack;
  //рисуем квадрат черным цветом внутри этой белой области
  Form1->Image2->Canvas->MoveTo(x, y);
  Form1->Image2->Canvas->LineTo(x+50, y+0);
  Form1->Image2->Canvas->LineTo(x+0, y+50);
  Form1->Image2->Canvas->LineTo(x+0, y+0);
  Form1->Image2->Canvas->LineTo(x+50, y+50);
  Form1->Image2->Canvas->LineTo(x+50, y+0);
  Form1->Image2->Canvas->LineTo(x+0, y+50);
  Form1->Image2->Canvas->LineTo(x+50, y+50);
  //теперь это область надо сохранить, видимо с помощью CopyRect
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.11.2010, 21:33
Ответы с готовыми решениями:

Где находится CopyRect?
ребята, пытаюсь написать элементы графического редактора. читаю книжечки. и тут вдруг штанга. надо использовать компонент copyRect и где...

Не могу осуществить Copyrect
Доброго времени суток. не могу скопировать часть изображения из одной области в другую. void __fastcall...

Рисование спрайтов, прозрачность (TCanvas, CopyRect)
Вообщем решил попробовать написать небольшую игрушку, но столкнулся с проблемой: написал класс для рисования спрайта...

4
Эксперт С++
 Аватар для MikeSoft
3957 / 1812 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
21.11.2010, 22:06
Цитата Сообщение от Опа!! Посмотреть сообщение
Проблема в том, что не могу придумать способа сохранить фигуру и вновь ее из буфера вывести.
А вы не пробовали сохранять координаты по которым вы рисуете фигуру (в массив или дерево)?
1
17 / 17 / 1
Регистрация: 30.09.2009
Сообщений: 89
22.11.2010, 00:54  [ТС]
Цитата Сообщение от MikeSoft Посмотреть сообщение
А вы не пробовали сохранять координаты по которым вы рисуете фигуру (в массив или дерево)?
Да, можно использовать такой вариант. Но хотелось бы именно через копирование, очистку и вставку это реализовать, это больше вроде бы соответсвует принципу очистки спрайтами.
0
Эксперт С++
 Аватар для MikeSoft
3957 / 1812 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
22.11.2010, 01:08
Опа!!, для того, чтобы выполнить копирование - всё равно необходимо обладать "заданной рабочей областью". В любом случае, координаты должны сохраняться, иначе вы наткнётесь на необходимость "нахождения" собственной фигуры попиксельной проверкой, а это очень длительный процесс с точки зрения анализа содержимого.

На мой взгляд, лучше изменять значения в массиве и только потом вызывать отрисовку.
К тому же, в этом случае можно продумать алгоритм отрисовки. К примеру, при смещении фигуры (в вашем случае, квадрата) вправо на половину ширины будет неизменённая область, которая не будет требовать перерисовки. Процесс разработки универсального алгоритма сложный, но весьма интересный, если вы решили заняться этим всерьёз.
1
72 / 72 / 5
Регистрация: 03.11.2009
Сообщений: 492
22.11.2010, 01:46
В RichEdit1 или в Memo1 заносится информация от движения мышки (прорисованный рисунок), благодаря которой можно воспроизвести(повторить) рисунок.
https://www.cyberforum.ru/cpp-... page4.html
Выложен Project1.rar
Если этот принцип подойдет, обращайся.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.11.2010, 01:46
Помогаю со студенческими работами здесь

C++ Builder xe2 Graphics::TWICImage CopyRect
Есть картинка. Graphics::TWICImage * img; Загружаю в неё png. Мне нужо теперь получить такой же TWICImage, взятый из какой то...

StretchDraw и CopyRect (рост памяти/пустые листы)
Доброго времени суток!! Функция размещает на белом листе картинку, попутно сжимая ее до нужных размеров. Делаю так: ...

Подвести Jpeg к TBitmap, функция CopyRect , С++ Buider
Здравствуйте! В моей программе мне нужно копировать часть рисунка , функция CopyRect замечательно справляеться с Bitmap'ами(bmp) , но при...

CopyRect
ошибка вида "Access violation" при запуске, сильно предполагаю что связано с CopyRect, не очень умею ей пользоваться... посмотрите...

Переделать в CopyRect анимацию
Доброе утро. Взгляните пожалуйста на программу, и если кто знает как переделать под CopyRect - можете сделать это?.. Простите что так, но...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru