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

Delphi Sources



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

 
 
Опции темы Поиск в этой теме Опции просмотра
  #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:

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
property Canvas: TCanvas read <font color="Red">GetCanvas</font>;
 
function TImage.GetCanvas: TCanvas;
var
  Bitmap: TBitmap;
begin
  if <font color="#ff0000">Picture.Graphic = nil</font> then
  begin
    <font color="#ff0000">Bitmap := TBitmap.Create</font>;
    try
      <font color="#ff0000">Bitmap.Width := Width</font>;
      <font color="#ff0000">Bitmap.Height := Height</font>;
      <font color="#ff0000">Picture.Graphic := Bitmap</font>;
    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.
Ответить с цитированием
 


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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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