2017-11-23 3 views
0

C#을 사용하여 처음부터 아날로그 시계를 만들려고하고 있는데이 시점에서 조금 꼼짝하지 않습니다.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); 
} 

을하지만 내가 시계에 두 번째 포인터 선을 그어야하는 방법 일반적이다. 내 문제는 그것이 내가 원하는 것을 정확하게하는 것이다. 하지만 60 초가 지난 후에는 60 줄이 있습니다. 좋은 포인터 줄을 표시하거나 이전 줄을 삭제하는 방법은 무엇입니까?

죄송합니다. 내 문제에 대한 답변을 작성하는 것이 쉽습니다. 그러나 나는 정말로 내가 대답으로 이해하는 것을 발견하지 못한다.

+5

새 라인을 페인팅하기 전에 매초마다 시계의 배경을 다시 칠하고 오래된 라인을 제거해야합니다. –

+0

@ ZoharPeled 그래서 3 개의 포인터 (초, 분, 시간)가있을 때 그 위치를 안전하게 지켜야하고 매초마다 다시 칠할 필요가 있습니까? –

+2

winforms로 처리하려면 yes를 입력하십시오. –

답변

2

새 라인을 페인팅하기 전에 매초마다 시계의 배경을 다시 칠하고 오래된 라인을 제거해야합니다. 물론 이것은 초침 (또는 포인터)의 모든 페인트에 대해 분침과 시침을 칠할 필요가 있음을 의미합니다. 두 분침과 시침도 모두 삭제되기 때문입니다.

winforms에는 레이어로 페인팅 개념이 없으므로 모든 것이 한면에 그려지기 때문에 먼저 새 페인팅을하기 전에 오래된 그림을 삭제해야합니다.

+0

'g.Clear (Color.White);' 지금 사용 해줘서 고맙습니다. :) –

+0

도와 줘서 기뻐합니다 :-) –

+0

Winform은 컨트롤에서 레이어를 그릴 수 없지만 여러 컨트롤로 레이어를 만들 수 있습니다. 동일한 크기의 컨트롤 4 개가 겹쳐지면 배경이 한 번 새로 고침되고 시간이 한 시간에 한 번 새로 고침됩니다. 그리하여 창 배경 대신 콘트롤에서 페인팅하는 것이 많은 일을 줄이기 때문에 더 빠를 것입니다. 24 시간 동안 백그라운드에서 345,000 개를 다시 그리는 반면 각 레이어에 대해 1 개의 컨트롤을 사용하면 87,865 회 다시 그리기가 400 % 빨라집니다. – Franck

1

나는 이런 식으로 할 것 : 나는 윈폼 컨트롤의 OnPaint에 그릴 수 배웠습니다

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); 
     } 
    } 
} 

. 다양한 접근 방식이 있다고 생각해보십시오.

이렇게하면 수동으로 그래픽을 지울 필요가 없습니다. 이것은 컨트롤이 무효화 될 때 발생합니다.

+0

흠, 나는 거기에서 무슨 짓을했는지 알아. 그러나 솔직히 말해서. 나는 수동 새로 고침 방법으로 아플 거라고 생각해. 단지 이것보다 더 이해하기 때문에. thx는 나중에 이것에 대한 답을 찾으려고합니다. –