zoukankan      html  css  js  c++  java
  • 练手WPF(一)——模拟时钟与数字时钟的制作(下)

    继续数字时钟。上一篇写好了数字笔划专用的DigitLine类。现在是时候使用它了。下面对一些主要代码进行说明。

    打开MainWindow.xaml.cs文件:

    (1)添加字段变量

    // 数字时钟字段定义
    DigitLine[] digitLine = new DigitLine[6];
    DigitLine[] digitLineBack = new DigitLine[6];
    
    DigitLine[] digitColon = new DigitLine[2];
    DigitLine[] digitColonBack = new DigitLine[2];

    第一对类数组变量用于6个数字及其背景字样,第二对是冒号用的。

    (2)在构造方法中进行变量初始化

    // 初始化数字
    for (int i=0; i<6; i++)
    {
        digitLine[i] = new DigitLine(Brushes.Black);
        digitLineBack[i] = new DigitLine(new SolidColorBrush(Color.FromArgb(255, 120, 120, 120)));
    }
    
    // 初始化冒号
    for (int i=0; i<2; i++)
    {
        digitColon[i] = new DigitLine(Brushes.Black);
        digitColonBack[i] = new DigitLine(new SolidColorBrush(Color.FromArgb(255, 120, 120, 120)));
    }

    (3)开始设置显示元素

    这个方法用于显示数字表外边框:

    /// <summary>
    /// 显示数字表矩形外框
    /// </summary>
    /// <param name="pos"></param>
    /// <param name="width"></param>
    /// <param name="height"></param>
    /// <param name="color"></param>
    private void DrawDigitRect(Point pos, double width, double height, Brush color)
    {
        Rectangle rect = new Rectangle();
        rect.Width = width;
        rect.Height = height;
        rect.Fill = color;
        Canvas.SetLeft(rect, pos.X);
        Canvas.SetTop(rect, pos.Y);
        digitCanvas.Children.Add(rect);
    
    }

    显示数字和冒号的背景,数字的话时只要画6个8就可以了,这个很容易理解,看一下真实的电子表就清楚了。

    /// <summary>
    /// 显示背景数字(底色)
    /// </summary>
    /// <param name="brush"></param>
    private void DrawDigitTimeBack(Brush brush)
    {
        // 第1、2位--小时
        Canvas.SetLeft(digitLineBack[0].Path0_9[8], 40);
        Canvas.SetTop(digitLineBack[0].Path0_9[8], 80);
        digitCanvas.Children.Add(digitLineBack[0].Path0_9[8]);
    
        Canvas.SetLeft(digitLineBack[1].Path0_9[8], 120);
        Canvas.SetTop(digitLineBack[1].Path0_9[8], 80);
        digitCanvas.Children.Add(digitLineBack[1].Path0_9[8]);
    
        // 冒号
        Canvas.SetLeft(digitColonBack[0].PathColon, 190);
        Canvas.SetTop(digitColonBack[0].PathColon, 100);
        digitCanvas.Children.Add(digitColonBack[0].PathColon);
    
        // 第二冒号
        Canvas.SetLeft(digitColonBack[1].PathColon, 370);
        Canvas.SetTop(digitColonBack[1].PathColon, 100);
        digitCanvas.Children.Add(digitColonBack[1].PathColon);
    
        // 3、4位--分钟
        Canvas.SetLeft(digitLineBack[2].Path0_9[8], 220);
        Canvas.SetTop(digitLineBack[2].Path0_9[8], 80);
        digitCanvas.Children.Add(digitLineBack[2].Path0_9[8]);
    
        Canvas.SetLeft(digitLineBack[3].Path0_9[8], 300);
        Canvas.SetTop(digitLineBack[3].Path0_9[8], 80);
        digitCanvas.Children.Add(digitLineBack[3].Path0_9[8]);
    
        // 5、6位--秒钟
        Canvas.SetLeft(digitLineBack[4].Path0_9[8], 400);
        Canvas.SetTop(digitLineBack[4].Path0_9[8], 80);
        digitCanvas.Children.Add(digitLineBack[4].Path0_9[8]);
    
        Canvas.SetLeft(digitLineBack[5].Path0_9[8], 480);
        Canvas.SetTop(digitLineBack[5].Path0_9[8], 80);
        digitCanvas.Children.Add(digitLineBack[5].Path0_9[8]);
    }

    将画外框和背景底色功能添加到构造方法的最后部分:

    // 画数字表背景矩形
    DrawDigitRect(new Point(-24, 36), 616, 196, Brushes.Black);
    DrawDigitRect(new Point(-16, 44), 600, 180, Brushes.Gray);
    
    // 画数字底色
    DrawDigitTimeBack(new SolidColorBrush(Color.FromArgb(255, 120, 120, 120)));

    (4)最重要的显示时间数字和冒号的方法:

    /// <summary>
    /// 显示数字时间
    /// </summary>
    private void DrawDigitTime()
    {
        // 删除已在画图区的数字
        for (int i=0; i<6; i++)
        {
            for (int j=0; j<10; j++)
            {
                if (digitCanvas.Children.Contains(digitLine[i].Path0_9[j]))
                {
                    digitCanvas.Children.Remove(digitLine[i].Path0_9[j]);
                }
            }
        }
    
        // 小时
        int hour = CurrTime.Hour;
        int hour1 = hour / 10;
        int hour2 = hour % 10;
        Canvas.SetLeft(digitLine[0].Path0_9[hour1], 40);
        Canvas.SetTop(digitLine[0].Path0_9[hour1], 80);
        digitCanvas.Children.Add(digitLine[0].Path0_9[hour1]);
    
        Canvas.SetLeft(digitLine[1].Path0_9[hour2], 120);
        Canvas.SetTop(digitLine[1].Path0_9[hour2], 80);
        digitCanvas.Children.Add(digitLine[1].Path0_9[hour2]);
    
        // 冒号闪烁
        if (CurrTime.Second % 2 == 0)
        {
            digitColon[0].PathColon.Visibility = Visibility.Visible;
            digitColon[1].PathColon.Visibility = Visibility.Visible;
        }
        else
        {
            digitColon[0].PathColon.Visibility = Visibility.Hidden;
            digitColon[1].PathColon.Visibility = Visibility.Hidden;
        }            
    
        // 分钟
        int minute = CurrTime.Minute;
        int minu1 = minute / 10;
        int minu2 = minute % 10;
        Canvas.SetLeft(digitLine[2].Path0_9[minu1], 220);
        Canvas.SetTop(digitLine[2].Path0_9[minu1], 80);
        digitCanvas.Children.Add(digitLine[2].Path0_9[minu1]);
    
        Canvas.SetLeft(digitLine[3].Path0_9[minu2], 300);
        Canvas.SetTop(digitLine[3].Path0_9[minu2], 80);
        digitCanvas.Children.Add(digitLine[3].Path0_9[minu2]);
        
        // 秒钟
        int second = CurrTime.Second;
        int sec1 = second / 10;
        int sec2 = second % 10;
        Canvas.SetLeft(digitLine[4].Path0_9[sec1], 400);
        Canvas.SetTop(digitLine[4].Path0_9[sec1], 80);
        digitCanvas.Children.Add(digitLine[4].Path0_9[sec1]);
    
        Canvas.SetLeft(digitLine[5].Path0_9[sec2], 480);
        Canvas.SetTop(digitLine[5].Path0_9[sec2], 80);
        digitCanvas.Children.Add(digitLine[5].Path0_9[sec2]);
    }

    根据当前时间,显示相应数字,很容易懂。

    (5)更新时间

    将上面的DrawDigitTime()方法调用添加到(上)篇的计时器事件方法中即可。现在该方法如下:

    /// <summary>
    /// 计时器事件
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void Timer_Tick(object sender, EventArgs e)
    {
        // 更新当前时间
        CurrTime = DateTime.Now;
    
        // 更新数字时钟数字
        DrawDigitTime();
    
        // 更新圆盘时针
        Update();
    }

    (6)大致如此,看看最后效果吧。

    最后来一个合影 :)

  • 相关阅读:
    面向对象的继承关系体现在数据结构上时,如何表示
    codeforces 584C Marina and Vasya
    codeforces 602A Two Bases
    LA 4329 PingPong
    codeforces 584B Kolya and Tanya
    codeforces 584A Olesya and Rodion
    codeforces 583B Robot's Task
    codeforces 583A Asphalting Roads
    codeforces 581C Developing Skills
    codeforces 581A Vasya the Hipster
  • 原文地址:https://www.cnblogs.com/moonblogcore/p/10927845.html
Copyright © 2011-2022 走看看