ToB企服应用市场:ToB评测及商务社交产业平台

标题: 在Winform程序中动态绘制体系名称,代替图片硬编码名称 [打印本页]

作者: 西河刘卡车医    时间: 2024-6-20 10:30
标题: 在Winform程序中动态绘制体系名称,代替图片硬编码名称
在以前我做程序的时间,一般在登录窗口里面表现程序名称,登录窗口一般设置一张背景图片,由于程序的名称一般都是确定的,以是也不存在太大的题目,不过如果客户定制不同的体系的时间,需要使用Photoshop修改下图层的文字,再天生图片,然后更换一下也可以了。不过本着减少客户使用繁琐性,也可以使用空白名称的通用图片,配上使用GDI+的方式动态绘制体系名称的方式处理,发现效果也还不错,本篇随笔先容一下这个处理的过程。
1、使用图片编辑程序修改的方式

如果我们接纳传统的图片编辑方式,一般我们倾向于使用Photoshop来处理,不过现在也可以使用剪影来实现更多的效果了。
如原先是接纳Photoshop来编辑登录图片的内容,这样体系登录的时间,就可以直接接纳背景图片了。

需要的时间,在Photoshop找到图片源文件,更换一下内容,重新天生图片即可。
然后再体系的登录界面中,更换一下使用Photoshop天生的背景图片,就可以简单的实现了效果的更换了。

使用这种方式创建的文字效果比较丰富,可以充分利用图片编辑软件创建的字体效果,不过就是需要安装这个巨无霸软件。
 
2、使用软件GDI+的方式动态绘制体系名称

前面使用Photoshop天生的背景图片,是一种办理方案,如果我们有相干的背景图片,也可以使用软件的GDI+的方式动态绘制体系名称。
起首我们使用Photoshop等图片编辑软件,编辑一下图片,保存标题位置为空白,然后也是通用的设置登录界面的背景,至于文字,我们通过登录窗口的Paint事件,使用GDI+的方式绘制体系名称。
我们的软件体系名称,一般是设置在配置文件中的,如下是WInform的App.config文件内容。
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <configuration>
  3.   <appSettings>
  4.    
  5.     <add key="DefaultDb" value="sqlserver" />
  6.    
  7.     <add key="<strong>ApplicationName</strong>" value="SqlSugar开发框架" />
  8.    
  9.     <add key="<strong>Manufacturer</strong>" value="广州爱奇迪软件科技有限公司" />
复制代码
如下是体系的绘制逻辑处理,由于处理代码行数较多,就抽取为辅助函数,方便查看重用。
  1. /// <summary>
  2. /// 系统登录界面
  3. /// </summary>
  4. public partial class Login : DevExpress.XtraEditors.XtraForm
  5. {
  6.     /// <summary>
  7.     /// 配置文件对象
  8.     /// </summary>
  9.     private AppConfig config = new AppConfig();
  10.     /// <summary>
  11.     /// 窗体构造函数
  12.     /// </summary>
  13.     public Login()
  14.     {
  15.         InitializeComponent();
  16.         //动态绘制软件的系统名称
  17.         this.Paint += (s, e)=>
  18.         {
  19.             string applicationName = config.AppConfigGet("ApplicationName") ?? "SqlSugar开发框架";
  20.             applicationName = JsonLanguage.Default.GetString(applicationName);
  21. <strong>            MyHelper.Draw3DTitle</strong>(e.Graphics, applicationName, Color.Black, Color.Gray);
  22.         };
  23.     }
复制代码
上面的MyHelper.Draw3DTitle就是我们封装的处理方式,用于对GDI+的处理过程举行剥离,进步代码的可阅读性。
在先容代码的详细实现过程前,我们来看看使用GDI+实现的效果,此中字体使用了一些3D的效果。

上面登录界面的效果是主动根据内容天生,此中文字如果比较多,也会主动根据宽度举行适应,把字体巨细调整符合。
由于实现的效果相对不是很复杂,因此代码我就全部贴出来供参考了。主要就是对字体举行调整,以及增长3D效果的处理。
[code]        public static void Draw3DTitle(Graphics g, string title, Color frontColor, Color shadowColor, bool useGradient = false,             int depth = 5,            string fontName = "华文中宋", FontStyle fontStyle = FontStyle.Bold, int maxFontSize = 36,            int startX = 140, int startY = 100, int targetWidth = 450, int targetHeight = 100)        {            // 获取适合目标宽度的字体巨细            var font = GetAdjustedFont(g, title, fontName, fontStyle, targetWidth, maxFontSize, 6);            // 绘制阴影            for (int i = depth; i >= 0; i--)            {                using (Brush shadowBrush = new SolidBrush(Color.FromArgb(255 - (depth - i) * 25, shadowColor)))                {                    g.DrawString(title, font, shadowBrush, new PointF(startX + i, startY + i));                }            }            Brush textBrush = new SolidBrush(frontColor);            // 创建渐变填充            if (useGradient)            {                textBrush = new LinearGradientBrush(new Rectangle(startX, startY, targetWidth, targetHeight), frontColor, Color.Blue, 45f);            }            // 绘制远景文本            g.DrawString(title, font, textBrush, new PointF(startX, startY));        }        ///         /// 根据目标宽度,调整字体巨细        ///         private static Font GetAdjustedFont(Graphics g, string text, string fontName, FontStyle fontStyle, int targetWidth, int maxFontSize, int minFontSize)        {            // 调整字体巨细,直到文本适合目标宽度            for (int size = maxFontSize; size >= minFontSize; size--)            {                var testFont = new Font(fontName, size, fontStyle);                var textSize = g.MeasureString(text, testFont);                if (textSize.Width




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4