Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Графика и игры
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 12.01.2011, 20:59
Drozh Drozh вне форума
Активный
 
Регистрация: 12.06.2008
Сообщения: 313
Репутация: 40
По умолчанию Вопрос по Image

Почему если пишу таким образом
Код:
var
  img: TImage;
begin
  img := TImage.Create(Form1);
  img.Parent := Form1;
  img.Left := 100;
  img.Top := 100;
  img.Canvas.Pen.Color := clRed;
  img.Canvas.Brush.Color := clRed;
  img.Height := 50;
  img.Width := 500;
  img.Canvas.RoundRect(0, 0, img.Width, img.Height, 10, 10);
Появляется обрезанный Image (fig1.jpg)

А если работу с Canvas поместить после установки размеров Image'а, тогда все выводится пучком (fig2.jpg). Из-за чего это возникает?
Изображения
Тип файла: jpg fig1.JPG (1.6 Кбайт, 19 просмотров)
Тип файла: jpg fig2.JPG (2.1 Кбайт, 17 просмотров)
Ответить с цитированием
  #2  
Старый 12.01.2011, 21:59
Аватар для movnet
movnet movnet вне форума
Начинающий
 
Регистрация: 24.07.2008
Сообщения: 127
Версия Delphi: Delphi 7
Репутация: 23
По умолчанию

также очень интересно

Последний раз редактировалось movnet, 12.01.2011 в 22:47.
Ответить с цитированием
  #3  
Старый 12.01.2011, 22:50
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Потому что канва TImage это не картинка. Ты один раз вывел и при последующем обновлении окна TImage понятия не имеет, что там на нем нарисовано (вообще, окна не перерисовывают то, что могут не перерисовывать). Если ты свернешь окно и потом развернешь обрвтно, то у тебя вообще вся картинка пропадет.
Ответить с цитированием
  #4  
Старый 12.01.2011, 23:05
Drozh Drozh вне форума
Активный
 
Регистрация: 12.06.2008
Сообщения: 313
Репутация: 40
По умолчанию

Хм, по сути я же рисую только после всех операций, т.е. после изменения размера
Ответить с цитированием
  #5  
Старый 12.01.2011, 23:11
Аватар для Pilot_Red
Pilot_Red Pilot_Red вне форума
Продвинутый
 
Регистрация: 01.11.2006
Адрес: Карелия
Сообщения: 702
Версия Delphi: D7
Репутация: 11581
По умолчанию

все равно не понятно....
Здесь почему-то никак длина не хочет изменяться... если её изменять до изменения всяких свойств кисти и карандаша, то все ок.
Высота нормально себя ведет....
Ответить с цитированием
  #6  
Старый 13.01.2011, 09:29
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

в данном случае не совсем так, что TImage это не картинка. если она не содержит никакого графического объекта (Picture.Graphic), т.е. была только что создана, как в данном примере, то при обращении к ее Canvas создается Bitmap, который становится ее графическим объектом Picture.Graphic. и вся дальнейшая отрисовка через Canvas идет на этом Bitmap. когда Bitmap создается, то его размеры берутся равными размеру самого TImage. но если меняются размеры TImage, то размеры уже существующего Bitmap не меняются. и если рисовать на Canvas такого TImage, то даже при сворачивании или перемещении по нему другого окна картинка остается нормальной - Bitmap благополучно отрисовывается. чтобы после изменения размера TImage все было в порядке, нужно Picture.Graphic:=nil; таким образом создастся новый Bitmap с новыми размерами, но, естественно, со значениями по умолчанию для карандашей и кистей и.т.д.
разобраться в этом поможет исходник TImage:

Код:
property Canvas: TCanvas read GetCanvas;

function TImage.GetCanvas: TCanvas;
var
  Bitmap: TBitmap;
begin
  if Picture.Graphic = nil then
  begin
	Bitmap := TBitmap.Create;
	try
	  Bitmap.Width := Width;
	  Bitmap.Height := Height;
	  Picture.Graphic := Bitmap;
	finally
	  Bitmap.Free;
	end;
  end;
  if Picture.Graphic is TBitmap then
	Result := TBitmap(Picture.Graphic).Canvas
  else
	raise EInvalidOperation.Create(SImageCanvasNeedsBitmap);
end;

property Width: Integer read FWidth write SetWidth;

procedure TControl.SetWidth(Value: Integer);
begin
  // не уведомляется Picture.Graphic об изменении размеров
  SetBounds(FLeft, FTop, Value, FHeight);
  Include(FScalingFlags, sfWidth);
end;
__________________
Пишу программы за еду.
__________________

Последний раз редактировалось NumLock, 13.01.2011 в 09:34.
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 02:17.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025