Вверх ↑
Ответов: 2236
Рейтинг: 676
#1: 2018-12-15 17:51:37 ЛС | профиль | цитата
Нужно добавить восстановление позиции штриховой кисти.
Схема для наглядности


Add(MainForm,2953706,336,259)
{
Width=660
Height=356
Position=1
link(onCreate,12078549:doWork1,[(424,279)])
}
Add(Img_FloodFill,1917040,441,301)
{
Color=65535
ColorBorder=16711935
Style=6
link(onDraw,6784223:doDraw,[])
link(Bitmap,8794527:Var2,[])
}
Add(Button,6858880,336,301)
{
Left=305
Top=275
link(onClick,16704057:doEvent1,[])
}
Add(PaintBox,9740949,441,238)
{
Left=45
Top=20
Width=575
Height=230
Color=0
}
Add(HubEx,12078549,420,301)
{
link(onEvent,1917040:doDraw,[])
}
Add(Hub,16704057,385,301)
{
link(onEvent1,12078549:doWork2,[])
link(onEvent2,9740949:doRefresh,[(409,314)(409,244)])
}
Add(Img_FloodFill,6784223,483,301)
{
X=1
Y=1
Color=255
ColorBorder=16711935
UseOffsetFill=1
Style=6
link(Bitmap,8794527:Var3,[(489,285)])
}
Add(GetDataEx,8794527,441,280)
{
link(Data,9740949:Bitmap,[])
}
  Запустив схему можно увидеть как PaintBox заливается первым элементом FloodFill желтой сеткой (заливка не сдвигается UseOffsetFill = False), а потом вторым FloodFill красной сеткой с смещенной заливкой на 1 пиксель по Х и Y (UseOffsetFill = True).
  Нажав кнопку можно увидеть что останется только красная сетка. Причина в том что второй FloodFill сдвинул позицию, а первый FloodFill об этом не знает и первая сетка закрашивается второй. Так как позиция штриховой кисти в Canvas-е PaintBox-а, то один раз сдвинутая позиция одним элементом будет использованы по умолчанию остальными.
  Элементов изменяющих позицию штриховой кисти шесть: Img_Arc, Img_Rectangle, Img_Ellipse, Img_Polygon, Img_FloodFill и RGN_Draw.

Для восстановления позиции можно использовать два способа:
1. Поставить позицию кисти в нулевую позицию. Достаточно перед FINALLY в _work_doDraw добавить строку:

SetBrushOrgEx(pDC, 0, 0, nil);
2. Запомнить позицию при изменении и восстановить в конце.

procedure THIImg_FloodFill._work_doDraw;
var
OldOrgX: TPoint;//добавить - для хранения старой позиции

....

begin

....

case _prop_UseOffsetFill of
1: SetBrushOrgEx(pDC, x1, y1, @OldOrgX);//заменяем nil на @OldOrgX
2: begin
p := cardinal(ReadInteger(_Data, _data_OffsetFill, 0));
SetBrushOrgEx(pDC, smallint(p and $FFFF), smallint(p shr 16), @OldOrgX)//заменяем nil на @OldOrgX
end;
end;

....

if _prop_UseOffsetFill > 0 then SetBrushOrgEx(pDC, OldOrgX.X, OldOrgX.Y, nil);//добавить: если изменяли позицию восстанавливаем.
FINALLY

Вот не знаю какой способ лучше. Первый вроде бы как проще и его вполне хватит, но второй более корректный.
Кто что скажет?
карма: 11

0