zoukankan      html  css  js  c++  java
  • C#检查字体是否存储,以及安装

    数码管

    在开发上位机UI界面时,我们常常会希望数值可以以7段数码管的形式呈现。

    关于7段数码管,最早接触应该是学习单片机的时候,它可以将数字或者字母以7段字符来呈现,所以有时候也叫7段LED数码管显示。

    实现思路

    C#想要实现7段数码管显示,一般会有两种思路,一种是GDI+,通过代码绘制的方式来实现,今天,给大家介绍另外一种简单而又方便的方式,那就是通过设置字体,提前做好一个7段码的字体,在电脑中安装好即可,当然字体也可以用现成的,这里给大家提供一个线程的7段码字体,公众号回复关键词:7SEG

    使用也很简单,就是拖放一个Label标签到界面上,然后设置字体选择为7SEG,设置合适的字体大小即可。

    使用7SEG字体,前提要安装这个字体,安装也很简单,双击下载的7SEG.ttf即可。

    最终呈现的效果如下所示:

    项目应用

    这个提及一下项目应用,如果我们开发好项目,把程序放到其他电脑上使用,由于其他电脑没有安装7SEG的字体,效果肯定会不一样。

    一种方法就是提前手动安装好字体,然后再运行程序,但是也没有其他好的方法呢?

    也许你们也想到了,就是通过代码自动完成,思路就是检测字体是否存在,存在则继续,不存在则通过代码安装字体。

    所以首先需要第一个方法,检测某个字体是否存在,方法如下:

            /// <summary>
            /// 检测某种字体样式是否可用
            /// </summary>
            /// <param name="familyName">字体名称</param>
            /// <param name="fontStyle">字体样式</param>
            /// <returns></returns>
            private bool CheckFont(string familyName, FontStyle fontStyle = FontStyle.Regular)
            {
                InstalledFontCollection installedFontCollection = new InstalledFontCollection();
                FontFamily[] fontFamilies = installedFontCollection.Families;
                foreach (var item in fontFamilies)
                {
                    if (item.Name.Equals(familyName))
                    {
                        return item.IsStyleAvailable(fontStyle);
                    }
                }
                return false;
            }
    
    

    有了这个方法之后,还需要另外一个方法就是安装字体,安装字体需要提供字体的路径,代码如下:

            /// <summary>
            /// 安装字体
            /// </summary>
            /// <param name="fontFilePath">字体文件全路径</param>
            /// <returns>是否成功安装字体</returns>
            /// <exception cref="UnauthorizedAccessException">不是管理员运行程序</exception>
            /// <exception cref="Exception">字体安装失败</exception>
            private bool InstallFont(string fontFilePath)
            {
                try
                {
                    System.Security.Principal.WindowsIdentity identity = System.Security.Principal.WindowsIdentity.GetCurrent();
                    System.Security.Principal.WindowsPrincipal principal = new System.Security.Principal.WindowsPrincipal(identity);
                    //判断当前登录用户是否为管理员
                    if (principal.IsInRole(System.Security.Principal.WindowsBuiltInRole.Administrator) == false)
                    {
                        throw new UnauthorizedAccessException("当前用户无管理员权限,无法安装字体");
                    }
                    //获取Windows字体文件夹路径
                    string fontPath = Path.Combine(System.Environment.GetEnvironmentVariable("WINDIR"), "fonts", Path.GetFileName(fontFilePath));
                    //检测系统是否已安装该字体
                    if (!File.Exists(fontPath))
                    {                 
                        //将某路径下的字体拷贝到系统字体文件夹下
                        File.Copy(fontFilePath, fontPath); //font是程序目录下放字体的文件夹
                        AddFontResource(fontPath);
                        //安装字体
                        WriteProfileString("fonts", Path.GetFileNameWithoutExtension(fontFilePath) + "(TrueType)", Path.GetFileName(fontFilePath));
                    }
                }
                catch (Exception ex)
                {
                    return false;
                }
                return true;
            }
    
    

    最终在项目运行初始化里执行如下代码:

               if (!CheckFont("7SEG"))
                {
                    if (InstallFont(FontPath))
                    {
                        MessageBox.Show("字体安装成功,重启生效!""字体安装");
                    }
                    else
                    {
                        MessageBox.Show("字体安装失败!""字体安装");
                    }
                }
    

    其中FontPath是字体文件的路径,一般可以提前方法根目录下。这样即使是没有安装字体的电脑,也可以直接正常显示了。

    出处:https://www.cnblogs.com/xiketang/p/14842229.html

  • 相关阅读:
    UML学习笔记<1>
    安装和配置jBPM4,并举个hello.w
    Myeclipse--jBPM4.3插件
    今天讲座的感悟--java
    程序员必看的书
    SSH的整合
    一款Timer倒计时器
    一款jq的计时器
    Code Complete-13/7/29
    java-Timer类使用方法
  • 原文地址:https://www.cnblogs.com/mq0036/p/3092473.html
Copyright © 2011-2022 走看看