|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Идиотский вопрос про TImage
Вот уже битый час не могу решить элементарнейшую вещь!
Мне надо, чтобы при ресайзе формы ресайзился и TImage на фоне. Делаю так: Код:
procedure TfrmSolar.FormResize(Sender: TObject); begin imgBack.Width := ClientWidth; imgBack.Height := ClientHeight; Gradient(imgBack); LinkRepaint; end; Как исправить? jmp $ ; Happy End! The Cake Is A Lie. |
#2
|
||||
|
||||
Почему-то мне кажется, что ошибка где-то в отрисовке. Что за функции Gradient и LinkRepaint?
Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#3
|
||||
|
||||
imgBack.align:=alClient;
- так будет красивее и еще, с рисунками не все так просто, когда надо перерисовать рисунок уничтожай TImage.Picture:=nil; и нанаво пересоздавай рисунок, это заставит полностью исключить артефакты |
#4
|
||||
|
||||
Артефактов и так не будет - у меня идет перерисовка всего находящегося на картинке. Gradient - отрисовка градиента на картинке, LinkRepaint - перерисовка всяких линий.
Пробовал с Alingn=alClient - то же самое... пробовал и без своих фунций перерисовки. З.Ы. но вот пересоздавание Picture помогло, спасибо. Странно... jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 13.12.2010 в 00:40. |
#5
|
||||
|
||||
Цитата:
Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#6
|
||||
|
||||
Если найдете способ покрасивее чем пересоздавание картинки, буду признателен:
Код:
procedure TfrmSolar.Gradient(Image: TImage); var i: Integer; Dr, Dg, Db, Colr: Extended; begin Dr := (R2 - R1) / Image.Height; Dg := (G2 - G1) / Image.Height; Db := (B2 - B1) / Image.Height; for i := 0 to Image.Height - 1 do begin Image.Canvas.Pen.Color := rgb(Round(R1 + i * Dr), Round(G1 + i * Dg), Round(B1 + i * Db)); Image.Canvas.MoveTo(0, i); Image.Canvas.LineTo(Image.Width - 1, i); end; end; LinkRepaint довольно сложная, но суть та же: юзаются только MoveTo, LineTo да Polygon. Код:
procedure TfrmSolar.LinkRepaint; const d = 3; l = 25; var i, j, t: Integer; cx1, cy1, cx2, cy2: Integer; k, dx1, dy1, dx2, dy2, g: Extended; Points: array [0 .. 2] of TPoint; begin imgBack.Canvas.Brush.Color := rgb((R1 + R2) div 2, (G1 + G2) div 2, (B1 + B2) div 2); imgBack.Canvas.Pen.Color := $FFFFFF - imgBack.Canvas.Brush.Color; imgBack.Canvas.Pen.Style := psDot; imgBack.Canvas.MoveTo(0, imgBack.Height div 2); imgBack.Canvas.LineTo(imgBack.Width - 1, imgBack.Height div 2); imgBack.Canvas.Pen.Style := psSolid; imgBack.Canvas.Pen.Color := $0; for i := 0 to cimg - 1 do for j := 0 to imgs[i].cl - 1 do begin cx1 := imgs[imgs[i].links[j]].Img.Left + imgs[imgs[i].links[j]] .Img.Width div 2; cy1 := imgs[imgs[i].links[j]].Img.Top + imgs[imgs[i].links[j]] .Img.Height div 2; cx2 := imgs[i].Img.Left + imgs[i].Img.Width div 2; cy2 := imgs[i].Img.Top + imgs[i].Img.Height div 2; if Max(cx1, cx2) = cx1 then begin t := cx2; cx2 := cx1; cx1 := t; t := cy1; cy1 := cy2; cy2 := t; end; imgBack.Canvas.MoveTo(cx1, cy1); imgBack.Canvas.LineTo(cx2, cy2); dx1 := 0; dy1 := 0; dx2 := 0; dy2 := 0; if abs(cx2 - cx1) > 5 then begin k := (cy2 - cy1) / (cx2 - cx1); g := arctan(d / l) + arctan(k); dx1 := sqrt(l * l + d * d) * cos(g); dy1 := sqrt(l * l + d * d) * sin(g); g := arctan(k) - arctan(d / l); dx2 := sqrt(l * l + d * d) * cos(g); dy2 := sqrt(l * l + d * d) * sin(g); end; Points[0].X := cx2; Points[0].Y := cy2; Points[1].X := cx2 - Round(dx1); Points[1].Y := cy2 - Round(dy1); Points[2].X := cx2 - Round(dx2); Points[2].Y := cy2 - Round(dy2); imgBack.Canvas.Brush.Color := 0; imgBack.Canvas.Polygon(Points); end; end; jmp $ ; Happy End! The Cake Is A Lie. |
#7
|
||||
|
||||
А кто же, блин, будет менять размеры самого изображения? Image.Canvas, Image.Bitmap, Image.Picture.Bitmap или Image.Picture, уже не помню, но у одного из них надо изменить Height и Width.
Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#8
|
||||
|
||||
Width и Height есть только у самого имажа и у Picture, но у Picture они Read-only...
jmp $ ; Happy End! The Cake Is A Lie. |
#9
|
||||
|
||||
О нашел! у Picture.Grafics. Спасибо большое!
jmp $ ; Happy End! The Cake Is A Lie. |
#10
|
||||
|
||||
Цитата:
РГРТУ - ФВТ - Системы Автоматизированного ПРоектирования. ت |
#11
|
|||
|
|||
Hfpvths TImage
>Размеры TImage могут отличаться от размеров TBitmap
Точнее так. В самом начале Image.Picture = nil. Когда вы в первый раз обращаетесь к Image.Canvas, создаётся Bitmap с размерами, равными размеру Image. Если размеры не менять, то всё работает и у пользователя создаётся впечатление, что что Image - единый объект. Но вот когда размер меняется, то вылезает различие между TImage и TImage.Picture. |
#12
|
||||
|
||||
Спасибо за объяснения.
jmp $ ; Happy End! The Cake Is A Lie. |