Как очистить канву картинки?
, Image1->Canvas->Refresh(); не работает
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.108] |
|
|
Как очистить канву картинки?
, Image1->Canvas->Refresh(); не работает
|
Сообщ.
#1
,
|
|
|
|
Здравствуйте!
Рисую на картинке прямоуголиники пунктирной линией.... ![]() ![]() void __fastcall TMap::Image1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { blMouseDown = true; //рисование прямоугольника Image1->Canvas->Refresh();//делаем рефреш, чтобы не было другого прямоугольника видно mx=X; my = Y;//сохраняем координаты начала } ![]() ![]() void __fastcall TMap::Image1MouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { blMouseDown = false; //рисование прямоугольника mx1=X; my1=Y ;//сохраняем координаты конца } ![]() ![]() void __fastcall TMap::Image1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { //рисование треугольника if (blMouseDown) { Image1->Canvas->Refresh();//Делаем рефреш, чтобы когда мы меняли размеры прямоугольника не было бы шлейфа Image1->Canvas->Pen->Style=psDash;//пунктирная линия, можно это писать не тут... Image1->Canvas->Rectangle(mx, my, X, Y );//рисуем на форме выделение } } Image1->Canvas->Refresh(); НЕ ХОЧЕТ ОЧИЩАТЬ НАРИСОВАННОЕ.... Может вопрос примитивен, то зарание извеняюсь.... Я наверное чего-то не знаю.... |
|
Сообщ.
#2
,
|
|
|
|
я точно не знаю(билдера под рукой нету), но может быть есть метод типа Image1->Canvas->Clear()? Просто Refresh() вызывает перерисовку канвы, а не очистку. Видишь между этим разницу?
|
|
Сообщ.
#3
,
|
|
|
|
Цитата miksayer @ я точно не знаю(билдера под рукой нету), но может быть есть метод типа Image1->Canvas->Clear()? Просто Refresh() вызывает перерисовку канвы, а не очистку. Видишь между этим разницу? Я понял... Но к сожелеию такого метода нет в канве. Смотрел справку по TCanvas тоже там не нашел интересного... |
|
Сообщ.
#4
,
|
|
|
|
канва не очищается а закрашивается.
|
|
Сообщ.
#5
,
|
|
|
|
Да, метода очистки нет, надо просто закрашивать, например, белым прямоугольником на весь имейдж
|
|
Сообщ.
#6
,
|
|
|
|
Цитата mr.Torrens @ Да, метода очистки нет, надо просто закрашивать, например, белым прямоугольником на весь имейдж Хороший вариант если картинка чистая. А что мне делать если у меня на картинке рисунок и мне нужно его видеть? |
|
Сообщ.
#7
,
|
|
|
|
Цитата А что мне делать если у меня на картинке рисунок и мне нужно его видеть? Хранить рисунок в битмапе, в момент перерисовки сначала загружать чистый рисунок из битмапа, потом на нем уже рисовать. Другой вариант - наложить еще один имедж поверх первого, установить ему прозрачность и рисовать в нем. |
|
Сообщ.
#8
,
|
|
|
|
Тогда просто перезагрузи рисунок :
![]() ![]() Image1->Picture Т.е. просто заново загрузи в TImage рисунок, если всё правильно понял, должно помочь! |
|
Сообщ.
#9
,
|
|
|
|
Всем спасибо за помощь
Мой код: ![]() ![]() void __fastcall TMap::Image1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { Image1->Picture->Bitmap->LoadFromFile("C:/map.bmp"); mx=X; my = Y;//сохраняем координаты начала } ![]() ![]() void __fastcall TMap::Image1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { if (GetAsyncKeyState(VK_LBUTTON)) { Image1->Picture->Bitmap->LoadFromFile("C:/map.bmp"); Image1->Canvas->Pen->Style=psDash; Image1->Canvas->Rectangle(mx, my, X, Y ); } } |
|
Сообщ.
#10
,
|
|
|
|
Цитата ![]() ![]() Image1->Picture->Bitmap->LoadFromFile("C:/map.bmp"); Лучше создать объект TBitmap, единожды загрузить в него рисунок и потом в имейдж просто копировать содержимое битмапа. Постоянная загрузка из файла это лишние временные затраты и плюс может быть мерцание. |
|
Сообщ.
#11
,
|
|
|
|
mr.Torrens
Добавлю только что и рисовать нужно тоже в Bitmap-е,а затем просто выводить его на любую канву. |
|
Сообщ.
#12
,
|
|
|
|
Цитата mr.Torrens @ Цитата ![]() ![]() Image1->Picture->Bitmap->LoadFromFile("C:/map.bmp"); Лучше создать объект TBitmap, единожды загрузить в него рисунок и потом в имейдж просто копировать содержимое битмапа. Постоянная загрузка из файла это лишние временные затраты и плюс может быть мерцание. Примером можно? |
|
Сообщ.
#13
,
|
|
|
|
можно
![]() ![]() Graphics::TBitmap* pic_bitmap; pic_bitmap = new Graphics::TBitmap; // грузим в него картинку pic_bitmap->LoadFromFile("c:\\map.bmp"); // загружаем в имейдж картинку из битмапа Image2->Picture->Bitmap = pic_bitmap; // рисуем; потом, когда надобадет перетереть старый рисунок просто перезагружаем картинку из битмапа |
|
Сообщ.
#14
,
|
|
|
|
Цитата mr.Torrens @ можно ![]() ![]() Graphics::TBitmap* pic_bitmap; pic_bitmap = new Graphics::TBitmap; // грузим в него картинку pic_bitmap->LoadFromFile("c:\\map.bmp"); // загружаем в имейдж картинку из битмапа Image2->Picture->Bitmap = pic_bitmap; // рисуем; потом, когда надобадет перетереть старый рисунок просто перезагружаем картинку из битмапа О понятно Огромное спасибо |
|
Сообщ.
#15
,
|
|
|
|
всегда рад
|
|
Сообщ.
#16
,
|
|
|
|
Привет всем!
Не могу разобраться с очисткой канвы(((( Как сделать так чтобы при нажатии кнопки, на Image оставалось только то, что создается в FormCreate; А все остальное стиралось???? ![]() ![]() Graphics::TBitmap* gBm = new Graphics::TBitmap; void __fastcall TForm1::FormCreate(TObject *Sender) { Image1->Canvas->Rectangle(250,250,200,200); gBm->Width=Image1->ClientWidth; gBm->Height=Image1->ClientWidth; gBm->Canvas->Brush->Style=bsClear; Image1->Canvas->Pen->Width=1; Image1->Canvas->Brush->Style=bsClear; } void __fastcall TForm1::Image1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { t1.x=X; t1.y=Y; t2.x=X; t2.y=Y; pict=true; } void __fastcall TForm1::Image1MouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { pict=false; gBm->Canvas->Rectangle(t1.x,t1.y,t2.x,t2.y); } void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { if(pict==true) { Image1->Canvas->Draw(0,0,gBm); Image1->Canvas->Pen->Color=clWhite; Image1->Canvas->Rectangle(t1.x,t1.y,t2.x,t2.y); t2.x=X; t2.y=Y; Image1->Canvas->Pen->Color=clBlack; Image1->Canvas->Rectangle(t1.x,t1.y,t2.x,t2.y); } |
|
Сообщ.
#17
,
|
|
|
|
Вариант 1 - нарисованное в FormCreate сохранить в буферный битмап. По кнопке вывести его на имэдж.
Вариант 2 - вынести рисование из FormCreate вынести в отдельную функцию. Вызывать её в FormCreate и по кнопке. |
|
Сообщ.
#18
,
|
|
|
|
Спасибо))))
|