Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.05.2012, 18:43   #1
Vova777
Уважаемый
Форумчанин
 
Аватар для Vova777
 
Регистрация: 04.07.2010
Сообщений: 318
Восклицание Проблема с Canvas.CopyRect

Тестирую фрагмент кода, в дальнейшем подгоню в мою программу.

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

Код:
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  RectSS1, RectSS2: TRect;
begin
  if sel = true then  //переменная sel иниц. в процедуре OnMouseDown
  begin
  Image2.Width:= abs(xld1 - x); //переменная xld1 иниц. в процедуре OnMouseDown
  Image2.Height:= abs(yld1 - y); //переменная yld1 иниц. в процедуре OnMouseDown
  Caption:= IntToStr(Image2.Width) + ' , ' + IntToStr(Image2.Height); //это нужно просто для контроля размеров

  RectSS1:= Bounds(x,yld1,xld1,y); //правая верхняя и левая нижняя точки копируемой области с TImage1
  RectSS2:= Bounds(Image2.Width,0,0,Image2.Height); //правая верхняя и левая нижняя точки копируемой области с TImage2

  Image1.Canvas.MoveTo(xld1,yld1);
  Image2.Canvas.CopyRect(RectSS2, Image1.Canvas, RectSS1); //в дальнейшем TImage2 будет заменен на TBitMap

  Image1.Canvas.LineTo(x, y);
  Image1.Canvas.CopyRect(RectSS1, Image2.Canvas, RectSS2);
  end;
end;
Кажется, что копирование выполняется не в нужную мне область или копируется не та область, т.к. предыдущие линии не стираются и на TImage2 нет изображения. В чем проблема?

Совсем забыл, на канве есть GDI-рисунок:
Код:
begin
  Image1.Canvas.Rectangle(2,3,45,65);
  Image1.Canvas.Rectangle(20,30,70,90);
end;
даешь высокое напряжение

Последний раз редактировалось Vova777; 22.05.2012 в 20:32.
Vova777 вне форума Ответить с цитированием
Старый 22.05.2012, 19:55   #2
Don Karleone
Форумчанин
 
Регистрация: 05.04.2010
Сообщений: 410
По умолчанию

а что за функция Bounds(...)? Она возвращает структуру типа TRect?
ICQ: 593-013-807
Don Karleone вне форума Ответить с цитированием
Старый 22.05.2012, 20:09   #3
Vova777
Уважаемый
Форумчанин
 
Аватар для Vova777
 
Регистрация: 04.07.2010
Сообщений: 318
Восклицание

Цитата:
Сообщение от Don Karleone Посмотреть сообщение
а что за функция Bounds(...)? Она возвращает структуру типа TRect?
Функция Bounds передаёт координаты вершин объекта типа TRect (прямоугольник). Указываются 2 вершины - правая верхняя и левая нижняя.
даешь высокое напряжение

Последний раз редактировалось Vova777; 22.05.2012 в 20:22.
Vova777 вне форума Ответить с цитированием
Старый 22.05.2012, 20:57   #4
Don Karleone
Форумчанин
 
Регистрация: 05.04.2010
Сообщений: 410
По умолчанию

если я правильно понял, то суть вашего кода заключается в том, чтобы копировать не все изображение, а только ту его прямоугольную часть, которая определяется прямоугольником из двух точек (xldl, yldl, x, y), где xldl и yldl - это начало отрезка, а x,y - его окончание. Таким образом стирается предыдущая линия. Компонент Image2 должен хранить изображение из Image1, но без прорисованной линии.
Код:
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  RectSS1, RectSS2: TRect;
begin
  if sel = true then  //переменная sel иниц. в процедуре OnMouseDown
  begin

  RectSS1:= Rect(xld1,yld1,Ax,Ay); //правая верхняя и левая нижняя точки копируемой области с TImage1

  Image1.Canvas.CopyRect(RectSS1, Image2.Canvas, RectSS1);
  Image1.Canvas.MoveTo(xld1,yld1);
  Image1.Canvas.LineTo(x, y);
  Ax:=x;  //глобальные переменные
  Bx:=y;
  end;
end;
Соответственно Image2 должно быть идентично Image1, т.е. Width, Height должны быть равны и в начале надо скопировать Image1 в Image2.

Пытаетесь реализовать алгоритм резиновой линии?
ICQ: 593-013-807
Don Karleone вне форума Ответить с цитированием
Старый 22.05.2012, 22:07   #5
Vova777
Уважаемый
Форумчанин
 
Аватар для Vova777
 
Регистрация: 04.07.2010
Сообщений: 318
Восклицание

Цитата:
Сообщение от Don Karleone Посмотреть сообщение
Если я правильно понял, то суть вашего кода заключается в том, чтобы копировать не все изображение, а только ту его прямоугольную часть, которая определяется прямоугольником из двух точек (xld1, yld1, x, y), где xld1 и yld1 - это начало отрезка, а x,y - его окончание. Таким образом стирается предыдущая линия. Компонент Image2 должен хранить изображение из Image1, но без прорисованной линии.
Вы все верно поняли. Таким образом перерисовка большого изображения полностью на TImage1 выполняться не будет.
Цитата:
Сообщение от Don Karleone Посмотреть сообщение
Соответственно Image2 должно быть идентично Image1, т.е. Width, Height должны быть равны и в начале надо скопировать Image1 в Image2.
Предлагаете дублировать изображение с канвы? Тогда TImage2 будет мной заменен на TBitMap. Почему то я посчитал, что динамическое изменение размеров TImage (или TBitMap) вслед за указателем мыши будет лучше. Наверное здесь и была моя ошибка.
Цитата:
Сообщение от Don Karleone Посмотреть сообщение
Пытаетесь реализовать алгоритм резиновой линии?
Да, вы правы. Мне кажется вариант с хранением копии в буферном TBitMap больше всего мне подходит по ряду объективных причин.
даешь высокое напряжение

Последний раз редактировалось Vova777; 22.05.2012 в 22:11.
Vova777 вне форума Ответить с цитированием
Старый 23.05.2012, 13:05   #6
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,899
По умолчанию

Не пойму, чего Вы паритесь.
Создали битмап с картинкой, написали функцию отрисовки в которой на имейдж сперва рисуется битмап (либо его фрагмент копиректеный) потом если включен флаг рисования линии - рисуется и линия канвасом по 2 точкам.
обработчик маусдаун - включить флаг и запомнить начало линии, обработчик маусап - выключить флаг, обработчик маусмув - запомнить коорды курсора как конечную точку и вызвать перерисовку. обработчик онпаинт формы - просто вызвать перерисовку

всё. а у вас 5 тем небось уже
phomm вне форума Ответить с цитированием
Старый 23.05.2012, 16:02   #7
Vova777
Уважаемый
Форумчанин
 
Аватар для Vova777
 
Регистрация: 04.07.2010
Сообщений: 318
По умолчанию

Цитата:
Сообщение от phomm Посмотреть сообщение
Не пойму, чего Вы паритесь.
Создали битмап с картинкой, написали функцию отрисовки в которой на имейдж сперва рисуется битмап (либо его фрагмент копиректеный) потом если включен флаг рисования линии - рисуется и линия канвасом по 2 точкам.
обработчик маусдаун - включить флаг и запомнить начало линии, обработчик маусап - выключить флаг, обработчик маусмув - запомнить коорды курсора как конечную точку и вызвать перерисовку. обработчик онпаинт формы - просто вызвать перерисовку

всё. а у вас 5 тем небось уже
мне интересно, пост №1 был внимательно прочтен?
даешь высокое напряжение
Vova777 вне форума Ответить с цитированием
Старый 23.05.2012, 19:30   #8
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,899
По умолчанию

Внимательно - не вижу там битмапов, только имейджи.
Потом там аж 2 копиректа.
Мои же слова только о битмапе и 1 копиректе.
phomm вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
проблема с Canvas.Draw Nater Общие вопросы Delphi 5 27.08.2010 12:45
Проблема с нарисованием чертежа з использованием canvas akaMisHka Помощь студентам 1 09.05.2010 14:04
Проблема с рисованием на canvas`e Timage (Delphi) Dalagardi Помощь студентам 9 25.03.2010 20:55
Canvas.CopyRect DELPHI Что и как... 08ekhiv1 Помощь студентам 1 09.06.2009 08:25
проблема копирования из image.canvas в переменную TBitMap h4muk Мультимедиа в Delphi 2 27.02.2009 09:44