C#winformGDI+表盘绘制(GIF图+音频+定时器)

GIF图参考程序:C# Winform 显示Gif动图_Jasongrass的博客-CSDN博客_winform显示gificon-default.png?t=M276https://blog.csdn.net/lj22377/article/details/72578064?utm_source=app&app_version=5.1.1&code=app_1562916241&uLinkId=usr1mkqgl919blen

定时器参考程序:https://blog.csdn.net/zzlwl/article/details/123429523?spm=1001.2014.3001.5502icon-default.png?t=M276https://blog.csdn.net/zzlwl/article/details/123429523?spm=1001.2014.3001.5502C#三种定时器_chinacodec的博客-CSDN博客_c#三种定时器icon-default.png?t=M276https://blog.csdn.net/chinacodec/article/details/104905795?utm_source=app&app_version=5.1.1&code=app_1562916241&uLinkId=usr1mkqgl919blen

零、一些定义调用与声明和初始化

        AnimateImage image;
        Bitmap mybmp;
        Image mying;
        SoundPlayer player = new SoundPlayer("bin/qiqi.wav");
        System.Timers.Timer t200ms = new System.Timers.Timer(200);
        delegate void t200msDo();
        double sec, min, hour;
        double secs, mins, hours;
        float x0 = 500, y0 = 500, r = 500;
        float xsec;
        float ysec;
        float xmin;
        float ymin;
        float xhour;
        float yhour;
        double sita = 6 * Math.PI / 180 / 5;
        double sitamin = 6 * Math.PI / 180 / 300;
        double sitahour = 30 * Math.PI / 180 / 18000;

        public Form1()
        {
            InitializeComponent();

            音乐暂停.Text = "Stop";
            时间.Text = "暂停";
            button1.Text = "小";
            button2.Text = "大";
            //GIF
            image = new AnimateImage(Image.FromFile("bin/app.gif"));
            image.OnFrameChanged += new EventHandler<EventArgs>(image_OnFrameChanged);
            SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true);
            //表盘显示
            mying = new Bitmap("bin/1.png");  //图片位置
            mybmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);  //图片大小
            pictureBox1.Image = mybmp;  //图片大小赋值给pictureBox
            //贴图
            var g = Graphics.FromImage(pictureBox1.Image);
            g.DrawImage(mying, x0 - r, y0 - r, 2 * r, 2 * r);
            pictureBox1.Refresh();
            g.Dispose();
            //
            sec = 0;
            min = 30;
            hour = 3;
            secs = sec / 60 * (2 * Math.PI) - Math.PI / 2;
            mins = (double)(min + sec / 60) / 60 * 2 * Math.PI - Math.PI / 2;
            hours = (double)(hour + (double)(min + sec / 60) / 60) / 12 * 2 * Math.PI - Math.PI / 2;
            t200ms.Elapsed += new System.Timers.ElapsedEventHandler(t200msOut);
            t200ms.AutoReset = true;
            t200ms.Enabled = false;

            t200ms.Start();
            //player.Play();
            player.PlayLooping();
        }

一、音频播放

1、添加命名空间

​​using System.Media;

2、实例化SoundPlayer类

        这里音频文件格式只能是.wav,存放位置:WindowsFormsApp\bin\Debug\netcoreapp3.1文件夹下。

SoundPlayer player = new SoundPlayer("qiqi.wav");

3、使用新线程播放.wav文件

player.Play();//播放
player.Stop();//停止
player.PlayLooping();//循环播放

二、添加背景图

1、添加命名空间

using System.Drawing.Imaging;

2、表盘显示

//表盘显示
            mying = new Bitmap("bin/1.png");  //图片位置
            mybmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);  //图片大小
            pictureBox1.Image = mybmp;  //图片大小赋值给pictureBox
            //贴图
            var g = Graphics.FromImage(pictureBox1.Image);
            g.DrawImage(mying, x0 - r, y0 - r, 2 * r, 2 * r);
            pictureBox1.Refresh();
            g.Dispose();

三、定时器

详情参考上面链接

System.Timers.Timer t200ms = new System.Timers.Timer(200);
delegate void t200msDo();
            t200ms.Elapsed += new System.Timers.ElapsedEventHandler(t200msOut);
            t200ms.AutoReset = true;
            t200ms.Enabled = false;

            t200ms.Start();
        public void t200msOut(object source, System.Timers.ElapsedEventArgs e)
        {
            Invoke(new t200msDo(t200msInvoke));
        }
void t200msInvoke()
{
    //这里面是定时器里面定时执行的内容
    t200ms.Start();
}

四、定时器内部函数

        void t200msInvoke()
        {
            var graph = this.pictureBox1.CreateGraphics();
            var green = new Pen(Color.Green, 2);
            var blue = new Pen(Color.Blue, 4);
            var blues = new Pen(Color.Blue, 6);
            secs = secs + sita;
            mins = mins + sitamin;
            hours = hours + sitahour;
            if (secs > 2 * Math.PI) secs -= Math.PI * 2;
            if (mins > 2 * Math.PI) mins -= Math.PI * 2;
            if (hours > 2 * Math.PI) hours -= Math.PI * 2;
            xsec = (float)(Math.Cos(secs) * r + x0);
            ysec = (float)(Math.Sin(secs) * r + y0);
            xmin = (float)(Math.Cos(mins) * r + x0);
            ymin = (float)(Math.Sin(mins) * r + y0);
            xhour = (float)(Math.Cos(hours) * r / 2 + x0);
            yhour = (float)(Math.Sin(hours) * r / 2 + y0);

            pictureBox1.Refresh();
            graph.DrawLine(green, x0, y0, xsec, ysec);
            graph.DrawLine(blue, x0, y0, xmin, ymin);
            graph.DrawLine(blues, x0, y0, xhour, yhour);
            t200ms.Start();
        }

五、各按键功能

1、textBox文本框输入

        输入时间;更改时间。

private void button1_Click(object sender, EventArgs e)
        {
            if (时间.Text.Equals("暂停"))
            {
                时间.Text = "开始";
                t200ms.Stop();
            }
            else
            { 
                时间.Text = "暂停";
                if (textBox1.Text == "" && textBox2.Text == "" && textBox3.Text == "")
                {
                    MessageBox.Show("请输入:时 分 秒");
                }
                else
                {
                    //MessageBox.Show(textBox3.Text.Substring(1).ToString());
                    sec = Convert.ToInt16(textBox3.Text.Substring(2));
                    min = Convert.ToInt16(textBox2.Text.Substring(2));
                    hour = Convert.ToInt16(textBox1.Text.Substring(2));
                    secs = sec / 60 * (2 * Math.PI) - Math.PI / 2;
                    mins = (double)(min + sec / 60) / 60 * 2 * Math.PI - Math.PI / 2;
                    hours = (double)(hour + (double)(min + sec / 60) / 60) / 12 * 2 * Math.PI - Math.PI / 2;
                    textBox1.Text = "时:";
                    textBox2.Text = "分:";
                    textBox3.Text = "秒:";
                    t200ms.Start();
                }
            }
            Invalidate();
        }

2、控制音乐停止与播放与Gif图暂停与播放

        private void 音乐暂停_Click(object sender, EventArgs e)
        {
            if (音乐暂停.Text.Equals("Stop"))
            {
                image.Stop();
                player.Stop();
                音乐暂停.Text = "Play";
            }
            else
            {
                image.Play();
                //player.Play();
                player.PlayLooping();
                音乐暂停.Text = "Stop";
            }
            Invalidate();
        }

3、控制表盘大小变化

        private void button1_Click_1(object sender, EventArgs e)
        {
            r--;
            var g = Graphics.FromImage(pictureBox1.Image);
            pictureBox1.Refresh();
            g.DrawImage(mying, x0 - r, y0 - r, 2 * r, 2 * r);
            g.Dispose();
        }
        private void button2_Click(object sender, EventArgs e)
        {
            r++;
            var g = Graphics.FromImage(pictureBox1.Image);
            pictureBox1.Refresh();
            g.DrawImage(mying, x0 - r, y0 - r, 2 * r, 2 * r);
            g.Dispose();
        }

六、运行图

 

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WPF(Windows Presentation Foundation)是一种用于创建用户界面的技术,而GDI(Graphics Device Interface)是一种用于绘制形的API。在WPF中,可以使用GDI来绘制形,通过使用GDI绘制形,我们可以实现更加定制化和高级的形效果。 在WPF中,可以使用GDI绘制各种类型的形,如直线、矩形、椭圆、多边形等。通过使用GDI,我们可以设置各种样式和属性,例如线条的颜色、线宽、填充颜色等,以及阴影、渐变等效果。使用GDI绘制形的过程是通过在WPF中创建一个GDI绘对象,然后调用其相应的方法和属性来实现绘制。 在使用GDI绘制形时,需要注意GDI是基于像素的,因此绘制形会受到屏幕分辨率的影响。在WPF中,可以使用Transform矩阵类来实现形的缩放、平移和旋转等操作,以适应不同分辨率的屏幕。 尽管WPF本身提供了丰富的绘制功能,但在某些情况下,使用GDI绘制形可能会更加灵活和高效。例如,如果需要实现一些特殊的效果,如镜像、叠加等,可以使用GDI来实现。此外,如果需要与现有的GDI代码进行交互,使用GDI绘制形也是一种不错的选择。 总之,使用WPF和GDI结合绘制形,可以实现更加丰富和高级的效果。通过使用GDI绘制形,我们可以更好地控制形的样式和属性,并且可以适应不同的分辨率和交互需求。这种组合使用可以使我们在绘制方面拥有更大的灵活性和创造力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值