Используя С# WinForms, у меня есть обычная метка, которую я заполняю закругленными углами. Проблема, с которой я сталкиваюсь, заключается в том, что полученные углы не всегда закруглены.
Для простоты понимания я создал 4 метки со скругленными углами, радиусом от 1 до 5. Я добавил к метке одну границу контура для простоты видимости, но даже без единого контура результаты одинаковы. Я также увеличил изображения этикеток, чтобы мы могли более четко видеть углы.
Используя радиус 1, вы можете ясно видеть, что верхние углы соответственно закруглены, но нижние границы остаются квадратными.
Использование радиуса 2 и 3 соответственно дает тот же результат внизу.
Используя радиус 4 и 5 соответственно, вы можете четко увидеть несоответствия на всех углах.
В общем, это не было бы слишком большой проблемой, если бы у меня была метка небольшого размера, но пользователь должен иметь возможность масштабировать, и тогда это выглядит просто некрасиво по мере увеличения радиуса, поскольку несоответствия хорошо видны.
Код, который я использую для создания заполненного прямоугольника, предположительно очень простой, как в примере, взятом из Как нарисовать прямоугольник со скругленными углами
public static GraphicsPath draw_rectangle(Rectangle bounds, int radius)
{
int diameter = radius * 2;
Size size = new Size(diameter, diameter);
Rectangle arc = new Rectangle(bounds.Location, size);
GraphicsPath path = new GraphicsPath();
if (radius == 0)
{
path.AddRectangle(bounds);
return path;
}
// top left arc
path.AddArc(arc, 180, 90);
// top right arc
arc.X = bounds.Right - diameter;
path.AddArc(arc, 270, 90);
// bottom right arc
arc.Y = bounds.Bottom - diameter;
path.AddArc(arc, 0, 90);
// bottom left arc
arc.X = bounds.Left;
path.AddArc(arc, 90, 90);
path.CloseFigure();
return path;
}
Я изучил и понял, что делает код и как он работает, я получаю углы и развертку, но я ни в коем случае не опытный графический манипулятор, поэтому я не знаю, делаю ли я что-то не так или есть способ чтобы улучшить код для согласованности всех углов.
Ваша помощь и\или пояснения приветствуются.
Graphics.ScaleTransform
?), какиеSmoothingMode
иPixelOffsetMode
вы используете и каковы точные координаты, когда вы рисуете/заполняете объекты в определенных границах. Все это должно быть установлено правильно, особенно при использовании масштабирования; в противном случае результат может быть смещен или размыт. Если вопрос по-прежнему актуален через год или около того, и вы предоставите недостающую информацию, я могу добавить ответ. - person György Kőszeg   schedule 03.07.2021