Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在c语言中只显示一个时钟指针#_C#_Winforms - Fatal编程技术网

C# 如何在c语言中只显示一个时钟指针#

C# 如何在c语言中只显示一个时钟指针#,c#,winforms,C#,Winforms,我正试图用C#从头开始创建一个模拟时钟,我在这一点上有点卡住了 我有以下代码: private void timer1_Tick(object sender, EventArgs e) { int seconde = DateTime.Now.Second; spx = cx + (int)(length * Math.Sin(Math.PI * seconde / 30)); spy = cy - (int)(length * Math.Cos(Math.PI *

我正试图用C#从头开始创建一个模拟时钟,我在这一点上有点卡住了

我有以下代码:

private void timer1_Tick(object sender, EventArgs e)
{
     int seconde = DateTime.Now.Second;
     spx = cx + (int)(length * Math.Sin(Math.PI * seconde / 30));
     spy = cy - (int)(length * Math.Cos(Math.PI * seconde / 30));
     a = new Point(spx, spy);

     g.DrawLine(pen, m, a);
}
表单load中有更多的变量,但这是我为时钟上的第二个指针画线的一般方式。我的问题是它正是我想要的。但60秒后,我有60行。如何显示好的指针行和/或删除旧的指针行


对不起,如果我的问题的答案很简单。但我真的找不到任何我能理解的答案

在绘制新线之前,您需要每秒重新绘制时钟的背景,以删除旧线。 当然,这意味着,对于秒针(或指针)的每一次绘制,您还需要绘制分针和时针,因为它们都将被删除


这是因为winforms没有分层绘制的概念—所有内容都绘制在一个曲面上—因此您必须先删除旧的绘制,然后才能绘制新的绘制。

在绘制新行之前,您需要每秒重新绘制时钟的背景,以删除旧的绘制线。 当然,这意味着,对于秒针(或指针)的每一次绘制,您还需要绘制分针和时针,因为它们都将被删除


这是因为winforms没有分层绘制的概念—所有内容都绘制在一个曲面上—因此您必须先删除旧的绘制,然后才能绘制新的绘制。

我会这样做:

public partial class Form1 : Form
{
    private int spx, spy, length;
    private Pen pen = new Pen(new SolidBrush(Color.Red), 0.5f);
    private Point a,m;

    public Form1()
    {
        InitializeComponent();
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        this.Refresh(); // force redraw
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);

        length = Math.Min(e.ClipRectangle.Height, e.ClipRectangle.Width) / 2;

        if (length != 0) // can't draw when there's no space
        {
            m = new Point(e.ClipRectangle.Width / 2, e.ClipRectangle.Height / 2);

            int seconde = DateTime.Now.Second;
            spx = m.X + (int)(length * Math.Sin(Math.PI * seconde / 30));
            spy = m.Y - (int)(length * Math.Cos(Math.PI * seconde / 30));
            a = new Point(spx, spy);

            e.Graphics.DrawLine(pen, m, a);
        }
    } 
}
我被教在Winforms控件的画图上画图。 我想有很多不同的方法


通过这种方式,您不必手动清除图形。控件无效时会发生这种情况。

我会这样做:

public partial class Form1 : Form
{
    private int spx, spy, length;
    private Pen pen = new Pen(new SolidBrush(Color.Red), 0.5f);
    private Point a,m;

    public Form1()
    {
        InitializeComponent();
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        this.Refresh(); // force redraw
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);

        length = Math.Min(e.ClipRectangle.Height, e.ClipRectangle.Width) / 2;

        if (length != 0) // can't draw when there's no space
        {
            m = new Point(e.ClipRectangle.Width / 2, e.ClipRectangle.Height / 2);

            int seconde = DateTime.Now.Second;
            spx = m.X + (int)(length * Math.Sin(Math.PI * seconde / 30));
            spy = m.Y - (int)(length * Math.Cos(Math.PI * seconde / 30));
            a = new Point(spx, spy);

            e.Graphics.DrawLine(pen, m, a);
        }
    } 
}
我被教在Winforms控件的画图上画图。 我想有很多不同的方法


通过这种方式,您不必手动清除图形。控件无效时会发生这种情况。

在绘制新行之前,您需要每秒重新绘制时钟背景,以删除旧行。@zoharpled因此,当我有三个指针(秒、分钟、小时)时,我需要保护这些位置,并每秒钟重新绘制一次O.O?如果要使用winforms,是的。Windows就是这样用
WM\u PAINT
绘制的@佐哈佩勒说:我知道。谢谢你把我推向一个方向。如果你把你的命令写在一个答案里,我会投票并接受它毕竟,我要求的是一种方法,而不是完整的解决方案:在绘制新行之前,你需要每秒重新绘制时钟的背景,以删除旧行。@Zoharpled,当我有三个指针(秒、分钟、小时)时,我是这样做的我需要保护那些position并每秒重新绘制它们O.O?如果要使用winforms,是的。Windows就是这样使用
WM\u-PAINT
绘制的@佐哈佩勒说:我知道。谢谢你把我推向一个方向。如果你把你的命令写在一个答案里,我会投票并接受它毕竟,我要求一种方法来做它,而不是完全解决:D
g.Clear(Color.White)谢谢您使用此功能,现在可以使用了。:)很高兴提供帮助:-)Winform无法在控件中绘制图层,但可以使用多个控件创建图层。如果重叠4个具有相同维度的控件,背景将在其生命周期内刷新一次,小时将每小时刷新一次…等等。所以,在控件中而不是在窗口的背景中绘制会更快,因为这样会减少很多。24小时后,在后台进行345000次重画,而每层1个控件将生成87865次重画,速度快400%。在winforms中不支持,因为它不支持真正的透明度。winforms中的透明控件实际上绘制其父控件背景以模拟透明度谢谢您使用此功能,现在可以使用了。:)很高兴提供帮助:-)Winform无法在控件中绘制图层,但可以使用多个控件创建图层。如果重叠4个具有相同维度的控件,背景将在其生命周期内刷新一次,小时将每小时刷新一次…等等。所以,在控件中而不是在窗口的背景中绘制会更快,因为这样会减少很多。24小时后,在后台进行345000次重画,而每层1个控件将生成87865次重画,速度快400%。在winforms中不支持,因为它不支持真正的透明度。winforms中的透明控件实际上绘制了它的父控件背景以模拟透明。嗯,我知道你在那里做了什么。但老实说。我想我会继续使用手动刷新方法。只是因为我比这更了解它。谢谢你的回答,我稍后会再看。嗯,我知道你在那里做了什么。但老实说。我想我会继续使用手动刷新方法。只是因为我比这更了解它。谢谢你的回答,我稍后再看。