一.效果图

二.简单谈谈实现思路

应该说实现方法还是很简单的,就是错位绘制而已.当然,这种效果没有完全体现出字体的立体效果,只是一种错位模仿,在对字体的边框进行描边后,又移动了一下绘制的坐标来体现阴影.感兴趣的朋友应该很容易实现.这里就不多说了.

三.部分源代码


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Data;
using System.Text;
using System.Windows.Forms;
namespace JCSControlLibary.AutoSetDocument
{
public partial class JcsBorderLabel : Label
{
private float borderSize = 1;//边框宽度
private Color borderColor = Color.White;//边框颜色
private SizeF drawningSize;
private bool isShowShadow = false;//是否显示阴影
#region Constructor
public JcsBorderLabel()
{
}
#endregion
#region Control Events
protected override void OnFontChanged(EventArgs e)
{
base.OnFontChanged(e);
this.Invalidate();
}
protected override void OnTextAlignChanged(EventArgs e)
{
base.OnTextAlignChanged(e);
this.Invalidate();
}
protected override void OnTextChanged(EventArgs e)
{
base.OnTextChanged(e);
}
protected override void OnForeColorChanged(EventArgs e)
{
base.OnForeColorChanged(e);
this.Invalidate();
}
#endregion
#region Properties
/// <summary>
/// 边框宽度
/// </summary>
[Browsable(true)]
[Category("Jcs属性")]
[Description("边框宽度")]
[DefaultValue(1F)]
public float BorderSize
{
get { return this.borderSize; }
set
{
this.borderSize = value;
if (value < 0)
{
throw new Exception("无效的值.");
}
else
{
borderSize = value;
}
this.OnTextChanged(EventArgs.Empty);
}
}
/// <summary>
/// 边框颜色
/// </summary>
[Browsable(true)]
[Category("Jcs属性")]
[DefaultValue(typeof(Color), "Black")]
[Description("边框颜色")]
public Color StringBorderColor
{
get { return this.borderColor; }
set
{
this.borderColor = value;
this.Invalidate();
}
}
/// <summary>
/// 是否显示阴影
/// </summary>
[Browsable(true)]
[Category("Jcs属性")]
[DefaultValue(false)]
[Description("是否显示阴影")]
public bool IsShowShadow
{
get { return this.isShowShadow; }
set
{
this.isShowShadow = value;
this.Invalidate();
}
}
#endregion
#region Private Methods
/// <summary>
/// 取得路径中最大宽度与高度的坐标
/// </summary>
private SizeF MeasurePath(GraphicsPath path)
{
SizeF maxSize = new SizeF(0, 0);
foreach (PointF point in path.PathPoints)
{
if (point.X > maxSize.Width)
maxSize.Width = point.X;
if (point.Y > maxSize.Height)
maxSize.Height = point.Y;
}
return maxSize;
}
#endregion
#region Drawnings
protected override void OnPaint(PaintEventArgs e)
{
if (this.Text.Length == 0)
return;
Point drawningPoint = new Point(0, 0);
e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
e.Graphics.CompositingQuality = CompositingQuality.HighQuality;
using (System.Drawing.Drawing2D.GraphicsPath drawningPath = new GraphicsPath())
{
drawningPath.Reset();
//fontsize是限制绘制字符所在矩形的高度
float fontSize = e.Graphics.DpiY * this.Font.SizeInPoints / 72;
drawningPath.AddString(this.Text, this.Font.FontFamily, (int)this.Font.Style, fontSize,
new Point(0, 0), StringFormat.GenericTypographic);
//得到要绘制的字符串中应用到指定字符样式后的最宽位置,最高位置
this.drawningSize = MeasurePath(drawningPath);
//将边框宽度与间隔宽度也计算上(高度亦然)
this.drawningSize.Height += this.borderSize + 5;
this.drawningSize.Width += this.borderSize + 5;
if (this.AutoSize)
{
drawningPoint.X = this.Padding.Left;
drawningPoint.Y = this.Padding.Top;
}
else
{
//If text is Left-Aligned
if (this.TextAlign == ContentAlignment.TopLeft ||
this.TextAlign == ContentAlignment.MiddleLeft ||
this.TextAlign == ContentAlignment.BottomLeft)
drawningPoint.X = this.Padding.Left;
else if (this.TextAlign == ContentAlignment.TopCenter ||
this.TextAlign == ContentAlignment.MiddleCenter ||
this.TextAlign == ContentAlignment.BottomCenter)
drawningPoint.X = (this.Width - drawningSize.ToSize().Width) / 2;
else drawningPoint.X = this.Width - (this.Padding.Right + drawningSize.ToSize().Width);
if (this.TextAlign == ContentAlignment.TopLeft ||
this.TextAlign == ContentAlignment.TopCenter ||
this.TextAlign == ContentAlignment.TopRight)
drawningPoint.Y = this.Padding.Top;
else if (this.TextAlign == ContentAlignment.MiddleLeft ||
this.TextAlign == ContentAlignment.MiddleCenter ||
this.TextAlign == ContentAlignment.MiddleRight)
drawningPoint.Y = (this.Height - drawningSize.ToSize().Height) / 2;
//If text is Bottom-Aligned
else drawningPoint.Y = this.Height - (this.Padding.Bottom + drawningSize.ToSize().Height);
}
if (isShowShadow)
{
drawningPath.Reset();
//加入时,指定了调整后的绘制坐标
drawningPath.AddString(this.Text, this.Font.FontFamily, (int)this.Font.Style, fontSize,
new Point(drawningPoint.X + 3, drawningPoint.Y - 2), StringFormat.GenericTypographic);
using (Pen drawningPen = new Pen(ControlPaint.Dark(this.ForeColor, 100)))
{
//先绘制边框
e.Graphics.DrawPath(drawningPen, drawningPath);
}
}
drawningPath.Reset();
drawningPath.AddString(this.Text, this.Font.FontFamily, (int)this.Font.Style, fontSize,
drawningPoint, StringFormat.GenericTypographic);
//绘制前景色
using (SolidBrush drawningForecolorBrush = new SolidBrush(this.ForeColor))
{
e.Graphics.FillPath(drawningForecolorBrush, drawningPath);
}
//绘制边框
if (borderSize > 0)
{
using (Pen drawningPen = new Pen(this.borderColor))
{
drawningPen.Width = borderSize;
e.Graphics.DrawPath(drawningPen, drawningPath);
}
}
}
}
#endregion
}
}

Label立体字体效果相关推荐

  1. android立体3D效果_PS教程:铝膜气球字制作的完整教程,3D立体效果字体的制作...

    这一篇主要是用PS做一种3D立体字体效果,铝膜气球字体,当然学会之后,举一反三,可以做成其他图案的铝膜气球效果. 铝膜气球在目前的各种庆典,婚庆,庆贺宴席上,用的比较普遍:这个字体效果,后期可以用于室 ...

  2. ai如何旋转画布_「AI教程」使用AI制作3D立体文字效果

    今天macdown小编要通过AI制作一种3D立体字体,主要的知识点是混合工具的使用.Shift键.Alt键的灵活运用.3D旋转命令.投影效果的创建等,学会后可以应用在需要的设计中,比如海报设计,log ...

  3. 【有了可图网】PS实战系列64:用PS的3D功能设计制作一个酷炫的彩色立体字体

    本篇教大家如何巧用PS的3D功能设计制作一个酷炫的彩色立体字体!教程讲解过程超详细,主要用到了PS的滤镜.调整层以及图层样式来完成效果,需转学起来! 彩色立体文字纹理素材链接链接:https://pa ...

  4. 【有利可图网】PS教程:巧用PS设计制作3D金属铆钉字体效果

    本篇教大家如何巧用PS设计制作3D金属铆钉字体效果!教程过程很详细,完成效果立体质感很强,感兴趣的小伙伴参考思路过程,收走学起来!

  5. Cesium加载entities实体,包括文字标注,图标(动态缩放效果),线(尾迹线效果),面(动态闪烁效果),背景图,围栏(立体分层效果),渐变色圆柱,扇形图等

    加载图标和文字标注 addPoints(data) {if (data && data.length > 0) {let datasource = map_common_addD ...

  6. html金属质感立体字体动画js特效

    下载地址 一款html金属质感立体字体动画特效,该特效呈现了3d金属文字抖动的动画特效,鼠标可缩放旋转控制页面,效果非常棒. dd:

  7. QT 中 界面中消息的停留时间解决方案 以及 label 中字体大小和换行设置

    QT 中 界面中消息的停留时间解决方案 以及 label 中字体大小和换行设置 参考文章: (1)QT 中 界面中消息的停留时间解决方案 以及 label 中字体大小和换行设置 (2)https:// ...

  8. [译]CSS3实现柱状图的3D立体动画效果

    翻译自<Animated 3D Bar Chart with CSS3> 首先,我们看一看要实现的效果: 这篇文章所实现的动画效果起源于一个小小的想法,这个想法来自于另一个网站的一篇文章, ...

  9. cesium实现动态立体墙效果

    文章目录 1.实现效果 2.实现方法 2.1自定义材质 2.2纹理图片 2.3代码调用 Cesium实战系列文章总目录: 传送门 设置自定义MaterialProperty,实现动态立体墙体效果 1. ...

最新文章

  1. 在maven中引用github上的资源
  2. Fleury算法找欧拉环游
  3. tomcat 容器生命周期lifecycle
  4. sqlite3 select查询一列_一眼就会的sqlite3数据库
  5. IdentityServer4之持久化很顺手的事
  6. WPF 面试题及答案(三)
  7. ASP.NET之ScriptManager和ClientScriptManager
  8. Visual Studio 2017 编译Clang
  9. 计算机主板型号尺寸,10大华硕主板型号简介,组装电脑的朋友可别错过
  10. 【PS】106个水彩花卉和树叶画笔
  11. 高等数学:8.2 数量积、向量积、混合积
  12. 十分钟教你学会打包APP
  13. int类型和number类型区别
  14. python列表获取最后一个元素的方法_Python中如何获取 list/OrderedDict 的 第一个/最后一个 元素...
  15. [PowerQuery] PowerQuery各个组件功能
  16. 解决github.io 连接不安全,无法访问
  17. 操作系统-计算机硬件简介
  18. 程序设计思维与实践第九周作业
  19. Cisco Packet Tracer 最新版在官网如何下载?
  20. 计算机基础讨论,对计算机的基础概念讨论

热门文章

  1. java中%3e%3e是什么_python中%3e是什么意思
  2. 文末有福利 | IT从业者应关注哪些技术热点?
  3. CSDN每日一练:小桥流水人家
  4. linux搜狗输入法16.04,linux入门 ubuntu Ubuntu 16.04后的系统设置和软件安装(搜狗输入法、...
  5. 【论文 CCF C】An Adaptive Box-Normalization Stock Index Trading Strategy Based on Reinforcement Learning
  6. Redis的穿透、击穿、雪崩问题
  7. 如何用度量数据驱动代码评审的改善
  8. win10增加美式键盘
  9. 题库(3)_计算圆周率Π
  10. 走进MSTP -- 1. EOS业务