Я пытаюсь нарисовать скругленный прямоугольник со сглаженными углами, однако весь прямоугольник подвергается сглаживанию, в результате чего края прямоугольника становятся размытыми. Я бы хотел, чтобы сглаживались только закругленные углы, чтобы стороны прямоугольника были четко определены.
[img]https:/ /i.sstatic.net/rEAT0uuk.png[/img]
Приведенный ниже код создает выходные данные «Только линия» и «Только заливка», но как я могу получить что-то, что выглядит ближе к ожидаемому изображению на крайний правый? (создано вручную в MS Paint)
void GetRoundRectPath2(GraphicsPath* pPath, Rect r, int dia)
{
// diameter can't exceed width or height
if (dia > r.Width) dia = r.Width;
if (dia > r.Height) dia = r.Height;
// define a corner
Rect Corner(r.X, r.Y, dia, dia);
// begin path
pPath->Reset();
// top left
pPath->AddArc(Corner, 180, 90);
// tweak needed for radius of 10 (dia of 20)
if (dia == 20)
{
Corner.Width += 1;
Corner.Height += 1;
r.Width -= 1; r.Height -= 1;
}
// top right
Corner.X += (r.Width - dia - 1);
pPath->AddArc(Corner, 270, 90);
// bottom right
Corner.Y += (r.Height - dia - 1);
pPath->AddArc(Corner, 0, 90);
// bottom left
Corner.X -= (r.Width - dia - 1);
pPath->AddArc(Corner, 90, 90);
// end path
pPath->CloseFigure();
}
void FillRoundRect2(Graphics* pGraphics, Brush* pBrush, Rect r, Color border, int radius)
{
int dia = 2 * radius;
// set to pixel mode
int oldPageUnit = pGraphics->SetPageUnit(UnitPixel);
// define the pen
Pen pen(border, 1);
pen.SetAlignment(PenAlignmentCenter);
// get the corner path
GraphicsPath path;
// get path
GetRoundRectPath2(&path, r, dia);
// fill
pGraphics->FillPath(pBrush, &path);
// draw the border last so it will be on top
pGraphics->DrawPath(&pen, &path);
// restore page unit
pGraphics->SetPageUnit((Unit)oldPageUnit);
}
Graphics graphics(dc);
graphics.SetSmoothingMode(SmoothingModeAntiAlias);
// Line only
SolidBrush sbrA(Gdiplus::Color(0,255,0,0)); // Full Transparent
FillRoundRect2(&graphics, &sbrA, Gdiplus::Rect(10, 10, 40, 40), Gdiplus::Color(50, 255, 0, 0), 5);
// Fill only
SolidBrush sbr(Gdiplus::Color(50, 255, 0, 0));
FillRoundRect2(&graphics, &sbr, Gdiplus::Rect(10, 10, 40, 40), Gdiplus::Color(0, 255, 0, 0), 5);
Подробнее здесь: https://stackoverflow.com/questions/785 ... ased-using
Как нарисовать закругленный заполненный прямоугольник со сглаженными только углами с помощью GDI+? ⇐ C++
Программы на C++. Форум разработчиков
1716924446
Anonymous
Я пытаюсь нарисовать скругленный прямоугольник со сглаженными углами, однако весь прямоугольник подвергается сглаживанию, в результате чего края прямоугольника становятся размытыми. Я бы хотел, чтобы сглаживались только закругленные углы, чтобы стороны прямоугольника были четко определены.
[img]https:/ /i.sstatic.net/rEAT0uuk.png[/img]
Приведенный ниже код создает выходные данные «Только линия» и «Только заливка», но как я могу получить что-то, что выглядит ближе к ожидаемому изображению на крайний правый? (создано вручную в MS Paint)
void GetRoundRectPath2(GraphicsPath* pPath, Rect r, int dia)
{
// diameter can't exceed width or height
if (dia > r.Width) dia = r.Width;
if (dia > r.Height) dia = r.Height;
// define a corner
Rect Corner(r.X, r.Y, dia, dia);
// begin path
pPath->Reset();
// top left
pPath->AddArc(Corner, 180, 90);
// tweak needed for radius of 10 (dia of 20)
if (dia == 20)
{
Corner.Width += 1;
Corner.Height += 1;
r.Width -= 1; r.Height -= 1;
}
// top right
Corner.X += (r.Width - dia - 1);
pPath->AddArc(Corner, 270, 90);
// bottom right
Corner.Y += (r.Height - dia - 1);
pPath->AddArc(Corner, 0, 90);
// bottom left
Corner.X -= (r.Width - dia - 1);
pPath->AddArc(Corner, 90, 90);
// end path
pPath->CloseFigure();
}
void FillRoundRect2(Graphics* pGraphics, Brush* pBrush, Rect r, Color border, int radius)
{
int dia = 2 * radius;
// set to pixel mode
int oldPageUnit = pGraphics->SetPageUnit(UnitPixel);
// define the pen
Pen pen(border, 1);
pen.SetAlignment(PenAlignmentCenter);
// get the corner path
GraphicsPath path;
// get path
GetRoundRectPath2(&path, r, dia);
// fill
pGraphics->FillPath(pBrush, &path);
// draw the border last so it will be on top
pGraphics->DrawPath(&pen, &path);
// restore page unit
pGraphics->SetPageUnit((Unit)oldPageUnit);
}
Graphics graphics(dc);
graphics.SetSmoothingMode(SmoothingModeAntiAlias);
// Line only
SolidBrush sbrA(Gdiplus::Color(0,255,0,0)); // Full Transparent
FillRoundRect2(&graphics, &sbrA, Gdiplus::Rect(10, 10, 40, 40), Gdiplus::Color(50, 255, 0, 0), 5);
// Fill only
SolidBrush sbr(Gdiplus::Color(50, 255, 0, 0));
FillRoundRect2(&graphics, &sbr, Gdiplus::Rect(10, 10, 40, 40), Gdiplus::Color(0, 255, 0, 0), 5);
Подробнее здесь: [url]https://stackoverflow.com/questions/78546014/how-to-draw-a-rounded-filled-rectangle-with-only-the-corners-anti-aliased-using[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия