C# 如何在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 *
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
绘制的@佐哈佩勒说:我知道。谢谢你把我推向一个方向。如果你把你的命令写在一个答案里,我会投票并接受它毕竟,我要求一种方法来做它,而不是完全解决:Dg.Clear(Color.White)代码>谢谢您使用此功能,现在可以使用了。:)很高兴提供帮助:-)Winform无法在控件中绘制图层,但可以使用多个控件创建图层。如果重叠4个具有相同维度的控件,背景将在其生命周期内刷新一次,小时将每小时刷新一次…等等。所以,在控件中而不是在窗口的背景中绘制会更快,因为这样会减少很多。24小时后,在后台进行345000次重画,而每层1个控件将生成87865次重画,速度快400%。在winforms中不支持,因为它不支持真正的透明度。winforms中的透明控件实际上绘制其父控件背景以模拟透明度代码>谢谢您使用此功能,现在可以使用了。:)很高兴提供帮助:-)Winform无法在控件中绘制图层,但可以使用多个控件创建图层。如果重叠4个具有相同维度的控件,背景将在其生命周期内刷新一次,小时将每小时刷新一次…等等。所以,在控件中而不是在窗口的背景中绘制会更快,因为这样会减少很多。24小时后,在后台进行345000次重画,而每层1个控件将生成87865次重画,速度快400%。在winforms中不支持,因为它不支持真正的透明度。winforms中的透明控件实际上绘制了它的父控件背景以模拟透明。嗯,我知道你在那里做了什么。但老实说。我想我会继续使用手动刷新方法。只是因为我比这更了解它。谢谢你的回答,我稍后会再看。嗯,我知道你在那里做了什么。但老实说。我想我会继续使用手动刷新方法。只是因为我比这更了解它。谢谢你的回答,我稍后再看。