Duilib的圆角矩形 抗锯齿优化 弥补RoundRect不足(网易云信borderround版本)

摘要:
rcDraw.right-=nDelta值;0||m_rcBorderSize.bottom>rcBorder.right=rcBorder.left=m_rcItem.left+m_rcBorderSize.left/2;rcBorder.bottom=rcBorder.top=m_rcItem.top+m_rcBorderSize.top/2;
VListBox   name="list" padding="5,3,5,3" bordersize="1" bordercolor="red" borderround="15,15"

Duilib的圆角矩形 抗锯齿优化 弥补RoundRect不足(网易云信borderround版本)第1张

1、Control中的PaintBorder增加圆角矩形绘制判断

void Control::PaintBorder(IRenderContext* pRender)
{
if (m_strBorderColor.empty()) {
return;
}
DWORD dwBorderColor = 0;
if (!m_strBorderColor.empty()) {
dwBorderColor = GlobalManager::GetTextColor(m_strBorderColor);
}

if(dwBorderColor != 0) {
//判断是否需要画圆角矩阵
if ((m_cxyBorderRound.cx > 0 || m_cxyBorderRound.cy > 0) && m_nBorderSize > 0)
{
UiRect rcDraw = m_rcItem;
int nDeltaValue = m_nBorderSize / 2;
rcDraw.top += nDeltaValue;
rcDraw.bottom -= nDeltaValue;
if (m_nBorderSize % 2 != 0) {
rcDraw.bottom -= 1;
}
rcDraw.left += nDeltaValue;
rcDraw.right -= nDeltaValue;
if (m_nBorderSize % 2 != 0) {
rcDraw.right -= 1;
}
pRender->DrawRoundRect(rcDraw, m_cxyBorderRound, m_nBorderSize, dwBorderColor);
}
else
{
if (m_rcBorderSize.left > 0 || m_rcBorderSize.top > 0 || m_rcBorderSize.right > 0 || m_rcBorderSize.bottom > 0) {
UiRect rcBorder;
if (m_rcBorderSize.left > 0) {
rcBorder = m_rcItem;
rcBorder.right = rcBorder.left = m_rcItem.left + m_rcBorderSize.left / 2;
if (m_rcBorderSize.left == 1) {
rcBorder.bottom -= 1;
}
pRender->DrawLine(rcBorder, m_rcBorderSize.left, dwBorderColor);
}
if (m_rcBorderSize.top > 0) {
rcBorder = m_rcItem;
rcBorder.bottom = rcBorder.top = m_rcItem.top + m_rcBorderSize.top / 2;
if (m_rcBorderSize.top == 1) {
rcBorder.right -= 1;
}
pRender->DrawLine(rcBorder, m_rcBorderSize.top, dwBorderColor);
}
if (m_rcBorderSize.right > 0) {
rcBorder = m_rcItem;
rcBorder.left = rcBorder.right = m_rcItem.right - (m_rcBorderSize.right + 1) / 2;
if (m_rcBorderSize.right == 1) {
rcBorder.bottom -= 1;
}
pRender->DrawLine(rcBorder, m_rcBorderSize.right, dwBorderColor);
}
if (m_rcBorderSize.bottom > 0) {
rcBorder = m_rcItem;
rcBorder.top = rcBorder.bottom = m_rcItem.bottom - (m_rcBorderSize.bottom + 1) / 2;
if (m_rcBorderSize.bottom == 1) {
rcBorder.right -= 1;
}
pRender->DrawLine(rcBorder, m_rcBorderSize.bottom, dwBorderColor);
}
}
else if (m_nBorderSize > 0) {
UiRect rcDraw = m_rcItem;
int nDeltaValue = m_nBorderSize / 2;
rcDraw.top += nDeltaValue;
rcDraw.bottom -= nDeltaValue;
if (m_nBorderSize % 2 != 0) {
rcDraw.bottom -= 1;
}
rcDraw.left += nDeltaValue;
rcDraw.right -= nDeltaValue;
if (m_nBorderSize % 2 != 0) {
rcDraw.right -= 1;
}
pRender->DrawRect(rcDraw, m_nBorderSize, dwBorderColor);
}
}
}
}

2、IRenderContext增加虚方法

virtual void DrawRoundRect(const UiRect& rc, const SIZE& round, int nSize, DWORD dwPenColor) = 0;

3、RenderContext_GdiPlus中增加定义与实现

virtual void DrawRoundRect(const UiRect& rc, const SIZE& round, int nSize, DWORD dwPenColor) override;

void RenderContext_GdiPlus::DrawRoundRect(const UiRect& rc, const SIZE& round, int nSize, DWORD dwPenColor)
{

Gdiplus::Graphics graphics(m_hDC);
graphics.SetSmoothingMode(Gdiplus::SmoothingModeAntiAlias);
Gdiplus::Pen pen(Gdiplus::Color(dwPenColor), (Gdiplus::REAL)nSize);
//裁剪区域不能作画,导致边框有时不全,往里收缩一个像素
UiRect _rc = rc;
_rc.left += 1;
_rc.top += 1;
_rc.right -= 1;
_rc.bottom -= 1;
//透明画刷
Gdiplus::SolidBrush brShadow(Gdiplus::Color(0,0, 0, 0));
Gdiplus::GraphicsPath pPath;
pPath.AddArc(_rc.left, _rc.top, round.cx, round.cy, 180, 90);
pPath.AddLine(_rc.left + round.cx, _rc.top, _rc.right - round.cx, _rc.top);
pPath.AddArc(_rc.right - round.cx, _rc.top, round.cx, round.cy, 270, 90);
pPath.AddLine(_rc.right, _rc.top + round.cy, _rc.right, _rc.bottom - round.cy);
pPath.AddArc(_rc.right - round.cx, _rc.bottom - round.cy, round.cx, round.cy, 0, 90);
pPath.AddLine(_rc.right - round.cx, _rc.bottom, _rc.left + round.cx, _rc.bottom);
pPath.AddArc(_rc.left, _rc.bottom - round.cy, round.cx, round.cy, 90, 90);
pPath.AddLine(_rc.left, _rc.bottom - round.cy, _rc.left, _rc.top + round.cy);
pPath.CloseFigure();
graphics.FillPath(&brShadow, &pPath);
graphics.DrawPath(&pen, &pPath);

}

免责声明:文章转载自《Duilib的圆角矩形 抗锯齿优化 弥补RoundRect不足(网易云信borderround版本)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇前端工程师技能之photoshop巧用系列第一篇——准备篇T4教程1 T4模版引擎之基础入门下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

es ElasticSearch 快速入门教程

一、前言本文版本说明:ElasticSearch版本:7.7 (目前最新版)Kibana版本:7.7(目前最新版)ElasticSearch在实际生产里通常和LogStash,Kibana,FileBeat一起构成Elastic Stack来使用,它是这些组件里面最核心的一个。因此学好ElasticSearch的必要性不言而喻,但是由于ElasticSear...

AcWing 476. 对称二叉树

树哈希解法 令 f[x][0] 为 : x 的子树都严格按照先左后右的顺序 Hash 的值。 f[x][1] 先右后左。 判断 x 是不是对称的二叉树只要判断 f[lc[x]][0] 和 f[rc[x]][1] 是否相等。 递推式: f[x][0]=p1*s1*P+a[x]*NP+((~rc[x]) ? f[rc[x]][0] : 997)*NPC...

redis产生随机数据

  由于需要研究redis cluster集群监控,需要产生随机数据,顾写此set和list随机数据生成代码。 直接贴代码 # coding: utf-8 # author Elephanyu from abc import abstractmethod from random import randint, choice from redisclust...

Qt之生成Window资源文件(.rc 文件)

简述 qmake 可以随意地自动生成一个适当填充的 Windows 资源文件。本节主要讲解如何用 qmake 处理一个 Windows 资源文件,并将其链接到一个可执行应用程序(EXE)或动态链接库(DLL)。 简述 详细说明 生成 rc 文件 系统变量 windres 示例 更多参考 详细说明 一个链接的 Windows 资源文件包含许多元素,可以由...

win32-使用FillRect绘制具有渐变颜色的客户区域背景

void OnEraseBkGnd(HWND hwnd) { /* Vars */ HDC dc; /* Standard Device Context; used to do the painting */ /* rect = Client Rect of the window; Temp = Temparory rec...

el-select数据超出展示样式

.selectBox{ /deep/.el-select_tags{   span:first-child{     max-100%;     text-align:left;     .el-tag--light:first-child{       display:inline-block;       max-100%;       .el-sel...