-
Здравствуйте форумчане, необходимо линейным градиентом залить прямоугольник, прямоугольник с скругленными углами, эллипс, трехугольник.
Прямоугольник я залил. Как залить скажем эллипс? Проблема с определением границ заливки. Я вижу два варианта : 1. Описать элипс и т.д. математически и если точка за пределами фигуры ее не закрашавать. 2. Закрасить прямоугольник градиентом и каким-то образом вырезать из него нужную фигуру. Как это сделать не знаю. 3. Может еще есть варианты?
-
ну, Ellipse() в WinAPI есть, дело только за тем, чтобы подобрать маску для его наложения на прямоугольник, заранее закрашенный градиентом.
-
-
-
-
> Pavia © (14.03.18 15:04) [3]MacOS..? В теме пометка "WinXP". Может лучше тогда уж лучше отправлять на оригинал?: http://www.antigrain.com/demo/Юрий__________, сперва надо определиться что и как именно вы делаете - чем вы пользуетесь, а чем нельзя пользоваться. VCL? WinAPI (GDI, GDI+, под оба)? Прочие сторонние библиотеки? Заливка своим алгоритмом "руками"? Хотя одного VCL полагаю не хватит. Так что предварительный ответ: 1. Описать фигуру математически и закрашивать только если пиксель внутри фигуры - но вы потратите прилично времени чтоб это оптимизировать. 2. Закрасить прямоугольник градиентом, сделать такого же размера ч/б маску с фигурой - и рисовать куда требуется через битовую маску. 3. Покорячится с WinAPI функциями для рисования, плюс регионы и GradientFill(). 4. Попробовать через GDI+. 5. Воспользоваться сторонними библиотеками, которые уже умеют это.
-
BeginPath(SomeCanvas.Handle);
Ellipse(SomeCanvas.Handle, ....);
EndPath(SomeCanvas.Handle);
Rgn := PathToRegion(SomeCanvas.Handle);
SelectClipRgn(SomeCanvas.Handle, Rgn);
GradientFill(SomeCanvas.Handle, ....);
SelectClipRgn(SomeCanvas.Handle, 0);
DeleteObject(Rgn);
-
Изучайте вектора.
-
По сути внешний контур - это Alpha-маска. Закрашиваете прямоугольник, а потом выводите с маской сделанной из контура.
-
-
Спасибо, сделал следующим образом, создал BMP в размер моего объекта, закрасил градиентом. Затем создал маску и вырезал нужный участок.
Var
Reg: hRGN;
BMP,Fon : TBitMap;
Begin
try
Fon:=TBitMap.Create;
Fon.Width:=Width;
Fon.Height:=Height;
BMP := TBitMap.Create;
BMP.Width:=Width;
BMP.Height:=Height;
GradientBMP(Fon,clBlue);
BMP.Canvas.Brush.Bitmap:=Fon;
Case fTypeFigure of
Rect : Reg := CreateRectRgn(0, 0, Width-1, Height-1);
Elipse : Reg := CreateEllipticRgn (0, 0, Width-1, Height-1); RoundRect : Reg := CreateRoundRectRgn(0, 0, Width-1, Height-1,Width div 4,Height div 4);
end;
PaintRgn (BMP.Canvas.Handle, Reg);
BMP.Canvas.Brush.Color :=fColorPen;
FrameRgn (BMP.Canvas.Handle, Reg, Bmp.Canvas.Brush.Handle, fWidthPen,fWidthPen);
BMP.Transparent:=True;
Can.Draw(Left,Top,BMP);
finally
Fon.Free;
BMP.Free;
DeleteObject (Reg);
end;
|