zoukankan      html  css  js  c++  java
  • 这种取巧的方法,你应该掌握

    数码管

    在开发上位机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是字体文件的路径,一般可以提前方法根目录下。这样即使是没有安装字体的电脑,也可以直接正常显示了。

  • 相关阅读:
    SuperMap房产测绘成果管理平台
    SuperMap产权登记管理平台
    Android adb shell am 的用法(1)
    由浅入深谈Perl中的排序
    Android 内存监测和分析工具
    Android 网络通信
    adb server is out of date. killing...
    引导页使用ViewPager遇到OutofMemoryError的解决方案
    adb logcat 详解
    How to send mail by java mail in Android uiautomator testing?
  • 原文地址:https://www.cnblogs.com/xiketang/p/14842229.html
Copyright © 2011-2022 走看看