在Winform程序中动态绘制系统名称,代替图片硬编码名称

winform · 浏览次数 : 15

小编点评

本文介绍了在程序登录窗口中使用动态绘制系统名称的方法。为了减少客户使用繁琐性,可以选择使用空白名称的通用图片,并通过GDI+方式动态绘制系统名称。本文详细描述了两种实现方式,并提供了一个示例代码。 1. 使用图片编辑程序修改的方式: 传统上,我们倾向于使用Photoshop来处理图片。但现在,我们也可以使用剪影来实现更多效果。首先,在Photoshop中编辑登录图片内容,保留标题位置为空白。然后,在登录窗口的Paint事件中,使用GDI+方式绘制系统名称。通过这种方法,可以充分利用图片编辑软件的字体效果,但需要安装Photoshop软件。 2. 使用软件GDI+的方式动态绘制系统名称: 在具备相关背景图片的情况下,我们可以使用GDI+方式动态绘制系统名称。首先,使用Photoshop等图片编辑软件编辑图片,保留标题位置为空白,并设置登录界面背景。然后,在Paint事件中,使用GDI+绘制系统名称。通过配置文件设置软件名称和开发商名称。最后,通过封装的辅助函数MyHelper.Draw3DTitle,对GDI+处理过程进行剥离,提高代码可阅读性。 总结:本文介绍了在程序登录窗口中使用动态绘制系统名称的两种方法。客户可以根据需要选择不同的处理方式,以减少使用繁琐性并提高效率。

正文

在以前我做程序的时候,一般在登录窗口里面显示程序名称,登录窗口一般设置一张背景图片,由于程序的名称一般都是确定的,所以也不存在太大的问题,不过如果客户定制不同的系统的时候,需要使用Photoshop修改下图层的文字,再生成图片,然后替换一下也可以了。不过本着减少客户使用繁琐性,也可以使用空白名称的通用图片,配上使用GDI+的方式动态绘制系统名称的方式处理,发现效果也还不错,本篇随笔介绍一下这个处理的过程。

1、使用图片编辑程序修改的方式

如果我们采用传统的图片编辑方式,一般我们倾向于使用Photoshop来处理,不过现在也可以使用剪影来实现更多的效果了。

如原先是采用Photoshop来编辑登录图片的内容,这样系统登录的时候,就可以直接采用背景图片了。

需要的时候,在Photoshop找到图片源文件,替换一下内容,重新生成图片即可。

然后再系统的登录界面中,替换一下使用Photoshop生成的背景图片,就可以简单的实现了效果的替换了。

使用这种方式创建的文字效果比较丰富,可以充分利用图片编辑软件创建的字体效果,不过就是需要安装这个巨无霸软件。

 

2、使用软件GDI+的方式动态绘制系统名称

前面使用Photoshop生成的背景图片,是一种解决方案,如果我们有相关的背景图片,也可以使用软件的GDI+的方式动态绘制系统名称。

首先我们使用Photoshop等图片编辑软件,编辑一下图片,保留标题位置为空白,然后也是通用的设置登录界面的背景,至于文字,我们通过登录窗口的Paint事件,使用GDI+的方式绘制系统名称。

我们的软件系统名称,一般是设置在配置文件中的,如下是WInform的App.config文件内容。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <appSettings>
    <!--指定默认的数据库类型,如果不指定则使用第一个连接字符串-->
    <add key="DefaultDb" value="sqlserver" />

    <!--软件名称-->
    <add key="ApplicationName" value="SqlSugar开发框架" />
    <!--开发商名称-->
    <add key="Manufacturer" value="广州爱奇迪软件科技有限公司" />

如下是系统的绘制逻辑处理,由于处理代码行数较多,就抽取为辅助函数,方便查看重用。

/// <summary>
/// 系统登录界面
/// </summary>
public partial class Login : DevExpress.XtraEditors.XtraForm
{
    /// <summary>
    /// 配置文件对象
    /// </summary>
    private AppConfig config = new AppConfig();

    /// <summary>
    /// 窗体构造函数
    /// </summary>
    public Login()
    {
        InitializeComponent();

        //动态绘制软件的系统名称
        this.Paint += (s, e)=>
        {
            string applicationName = config.AppConfigGet("ApplicationName") ?? "SqlSugar开发框架";
            applicationName = JsonLanguage.Default.GetString(applicationName);
            MyHelper.Draw3DTitle(e.Graphics, applicationName, Color.Black, Color.Gray);
        };
    }

上面的MyHelper.Draw3DTitle就是我们封装的处理方式,用于对GDI+的处理过程进行剥离,提高代码的可阅读性。

在介绍代码的详细实现过程前,我们来看看使用GDI+实现的效果,其中字体使用了一些3D的效果。

上面登录界面的效果是自动根据内容生成,其中文字如果比较多,也会自动根据宽度进行适应,把字体大小调整合适。

由于实现的效果相对不是很复杂,因此代码我就全部贴出来供参考了。主要就是对字体进行调整,以及增加3D效果的处理。

        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));
        }

        /// <summary>
        /// 根据目标宽度,调整字体大小
        /// </summary>
        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 <= targetWidth)
                {
                    return testFont;
                }
            }
            // 如果没有合适的大小,返回最小字体大小
            return new Font(fontName, minFontSize, fontStyle);
        }

如果需要更加丰富的效果 ,可以对画刷进行更多的定义,如可以使用渐变色等处理。

 以上就是我们SQLSugar开发框架中,对于动态程序标题的另外一种解决方案,我们可以根据需要选择不同的处理方式。

 

与在Winform程序中动态绘制系统名称,代替图片硬编码名称相似的内容:

在Winform程序中动态绘制系统名称,代替图片硬编码名称

在以前我做程序的时候,一般在登录窗口里面显示程序名称,登录窗口一般设置一张背景图片,由于程序的名称一般都是确定的,所以也不存在太大的问题,不过如果客户定制不同的系统的时候,需要使用Photoshop修改下图层的文字,再生成图片,然后替换一下也可以了。不过本着减少客户使用繁琐性,也可以使用空白名称的通...

在Winform分页控件中集成保存用户列表显示字段及宽度调整设置

在Winform的分页控件里面,我们提供了很多丰富的功能,如常规分页,中文转义、导出Excel、导出PDF等,基于DevExpress的样式的分页控件,我们在其上面做了不少封装,以便更好的使用,其中就包括集成保存用户列表显示字段及宽度调整设置。本篇随笔介绍这个实现的过程,通过在当前程序中序列化方式存储一个记录用户设置的文件,提供介质的存储和加载处理。

在WPF中使用WriteableBitmap对接工业相机及常用操作

写作背景 写这篇文章主要是因为工业相机(海康、大恒等)提供的.NET开发文档和示例程序都是用WinForm项目来说明举例的,而在WPF项目中对图像的使用和处理与在WinForm项目中有很大不同。在WinForm中用System.Drawing.Bitmap来处理图像,而在WPF中是用System.W

.NET C# 程序自动更新组件

引言 本来博主想偷懒使用AutoUpdater.NET组件,但由于博主项目有些特殊性和它的功能过于多,于是博主自己实现一个轻量级独立自动更新组件,可稍作修改集成到大家自己项目中,比如:WPF/Winform/Windows服务。大致思路:发现更新后,从网络上下载更新包并进行解压,同时在 WinFor

记一次 .NET某汽车零件采集系统 卡死分析

一:背景 1. 讲故事 前段时间有位朋友在微信上找到我,说他的程序会出现一些偶发卡死的情况,让我帮忙看下是怎么回事,刚好朋友也抓到了dump,就让朋友把 dump 丢给我,接下来用 windbg 探究下到底咋回事。 二:WinDbg 分析 1. 程序真的卡死吗 因为是一个 winform 程序,验证

记一次 .NET 某企业OA后端服务 卡死分析

一:背景 1.讲故事 前段时间有位朋友微信找到我,说他生产机器上的 Console 服务看起来像是卡死了,也不生成日志,对方也收不到我的httpclient请求,不知道程序出现什么情况了,特来寻求帮助。 哈哈,一般来说卡死的情况在窗体程序(WinForm,WPF) 上特别多,在 Console,We

在Winform中一分钟入门使用好看性能还好的Blazor Hybrid

# 在Winform中一分钟入门使用好看性能还好的Blazor Hybrid ## 安装模板 ```shell dotnet new install Masa.Template::1.0.0-rc.2 ``` ## 创建 Winform的Blazor Hybrid项目 ```shell dotnet

CefSharp自定义滚动条样式

在WinForm/WPF中使用CefSharp混合开发时,通常需要自定义滚动条样式,以保证应用的整体风格统一。本文将给出一个简单的示例介绍如何自定义CefSharp中滚动条的样式。 基本思路 在前端开发中,通过CSS来控制滚动条的样式是件寻常的事情。CefSharp也提供了功能强大的API方便开发人

在Winform分页控件中集成导出PDF文档的功能

当前的Winform分页控件中,当前导出的数据一般使用Excel来处理,Excel的文档可以用于后期的数据展示或者批量导入做准备,因此是比较好的输入输出格式。但是有框架的使用客户希望分页控件能够直接导出PDF,虽然Excel也可以直接转换为PDF,不过直接导出PDF的处理肯定更加方便直观。因此整理了一下分页控件导出PDF的处理过程,分享一下,希望能够给大家提供一定的帮助。

使用扩展函数方式,在Winform界面中快捷的绑定树形列表TreeList控件和TreeListLookUpEdit控件

在一些字典绑定中,往往为了方便展示详细数据,需要把一些结构树展现在树列表TreeList控件中或者下拉列表的树形控件TreeListLookUpEdit控件中,为了快速的处理数据的绑定操作,比较每次使用涉及太多细节的操作,我们可以把相关的数据绑定操作,放在一些辅助类的扩展函数中进行处理,这样可以更方便的,更简洁的处理数据绑定操作,本篇随笔介绍TreeList控件和TreeListLookUpEdi