Здравствуйте, дорогие друзья. На днях (а именно сегодня) мне понадобилась функция, рисующая прямоугольник с закруглёнными углами, которые я так люблю использовать в веб проектах. В последнее время вообще скругление уголков это стильно и молодёжно.
Современные тенденции не приемлют прямых углов! "DrawRect уже не торт!" - плачут блицеры.
Я решил не делать как
хрены профессионалы из Blitz Community и не стал наследовать класс от TMax2DGraphics ради единственной функции. Я просто написал свою глобальную функцию.
Фич лист:
Управление отображением через SetColor, SetAlpha
Минусы:
Игнорирует установленные ранее режимы отрисовки: SetOrigin, SetViewport, SetRotation
*, SetScale
*
Насчёт последних двух - спорный вопрос о необходимости.
И собственно код функции:
Function DrawRoundedRect(x:Float, y:Float, width:Float, height:Float, radius:Float = 10)
Local diametr:Float = (radius + radius)
Local oldScale:Float[2] ' 0..1 x,y
Local oldAngle:Float
Local oldViewport:Int[4] ' 0..3 x,y,width,height
'--- Store old settings
oldAngle:Float = GetRotation()
GetScale(oldScale[0], oldScale[1])
GetViewport(oldViewport[0], oldViewport[1], oldViewport[2], oldViewport[3])
SetRotation(0) ' no rotation
SetScale(1, 1) ' no scale
'--- Draw corners:
' left top
SetViewport(x, y, radius, radius)
DrawOval(x, y, diametr, diametr)
' right top
SetViewport(x + width - radius, y, radius, radius)
DrawOval(x + width - diametr, y, diametr, diametr)
' right bottom
SetViewport(x + width - radius, y + height - radius, radius, radius)
DrawOval(x + width - diametr, y + height - diametr, diametr, diametr)
' left bottom
SetViewport(x, y + height - radius, radius, radius)
DrawOval(x, y + height - diametr, diametr, diametr)
'--- Restore viewport
SetViewport(oldViewport[0], oldViewport[1], oldViewport[2], oldViewport[3])
'--- Draw rects
DrawRect(x + radius, y, width - diametr, radius)' top
DrawRect(x + width - radius, y + radius, radius, height - diametr)' right
DrawRect(x + radius, y + height - radius, width - diametr, radius)' bottom
DrawRect(x, y + radius, radius, height - diametr)' left
DrawRect(x + radius, y + radius, width - diametr, height - diametr)' middle
'--- Restore Scale, Rotation
SetScale(oldScale[0], oldScale[1])
SetRotation(oldAngle)
EndFunction
Немного комментариев помогут разобраться.
Надеюсь кому-либо пригодится
Семпл и скрины: