Решил написать замену на чистом VB:
- Код: Выделить всё
Sub RoundRect(ByVal ctx As Object, ByVal Left As Single, ByVal Top As Single, ByVal Right As Single, ByVal Bottom As Single, ByVal RadiusX As Single, ByVal RadiusY As Single)
Const pi = 3.14159265358979
'учесть баг в VB: аспект не масштабируется
Dim Aspect As Single, Radius As Single
Radius = RadiusY * ctx.ScaleY(1, vbUser, vbPixels) / ctx.ScaleX(1, vbUser, vbPixels)
Aspect = Abs(Radius) / RadiusX
If ctx.FillStyle = vbFSSolid Then
Radius = Abs(Radius)
ctx.Circle (Left + RadiusX, Top + RadiusY), Radius, , , , Aspect
ctx.Circle (Right - RadiusX, Top + RadiusY), Radius, , , , Aspect
ctx.Circle (Left + RadiusX, Bottom - RadiusY), Radius, , , , Aspect
ctx.Circle (Right - RadiusX, Bottom - RadiusY), Radius, , , , Aspect
ctx.Line (Left + RadiusX, Top)-(Right - RadiusX, Bottom), , B
ctx.Line (Left, Top + RadiusY)-(Right, Bottom - RadiusY), , B
Else
If Radius < 0 Then
Radius = -Radius
ctx.Circle (Left + RadiusX, Bottom - RadiusY), Radius, , pi * 0.5, pi, Aspect
ctx.Circle (Right - RadiusX, Bottom - RadiusY), Radius, , 0, pi * 0.5, Aspect
ctx.Circle (Left + RadiusX, Top + RadiusY), Radius, , pi, pi * 1.5, Aspect
ctx.Circle (Right - RadiusX, Top + RadiusY), Radius, , pi * 1.5, 0, Aspect
Else
ctx.Circle (Left + RadiusX, Top + RadiusY), Radius, , pi * 0.5, pi, Aspect
ctx.Circle (Right - RadiusX, Top + RadiusY), Radius, , 0, pi * 0.5, Aspect
ctx.Circle (Left + RadiusX, Bottom - RadiusY), Radius, , pi, pi * 1.5, Aspect
ctx.Circle (Right - RadiusX, Bottom - RadiusY), Radius, , pi * 1.5, 0, Aspect
End If
ctx.Line (Left + RadiusX, Top)-(Right - RadiusX, Top)
ctx.Line (Left + RadiusX, Bottom)-(Right - RadiusX, Bottom)
ctx.Line (Left, Top + RadiusY)-(Left, Bottom - RadiusY), , B
ctx.Line (Right, Top + RadiusY)-(Right, Bottom - RadiusY), , B
End If
End Sub
Иногда (в частности, при "квадратных" и "вытянутых по горизонтали" пикселах) этот код работает. Что дописать, чтобы работал всегда?