![]() |
|
#1
|
|||
|
|||
![]() Почему если пишу таким образом
Код:
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); А если работу с Canvas поместить после установки размеров Image'а, тогда все выводится пучком (fig2.jpg). Из-за чего это возникает? |
#2
|
||||
|
||||
![]() также очень интересно
![]() Последний раз редактировалось movnet, 12.01.2011 в 22:47. |
#3
|
|||
|
|||
![]() Потому что канва TImage это не картинка. Ты один раз вывел и при последующем обновлении окна TImage понятия не имеет, что там на нем нарисовано (вообще, окна не перерисовывают то, что могут не перерисовывать). Если ты свернешь окно и потом развернешь обрвтно, то у тебя вообще вся картинка пропадет.
|
#4
|
|||
|
|||
![]() Хм, по сути я же рисую только после всех операций, т.е. после изменения размера
|
#5
|
||||
|
||||
![]() все равно не понятно....
Здесь почему-то никак длина не хочет изменяться... если её изменять до изменения всяких свойств кисти и карандаша, то все ок. Высота нормально себя ведет.... ![]() ![]() ![]() |
#6
|
||||
|
||||
![]() в данном случае не совсем так, что 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. |