singlepost

C# – пишу аналоговые часы. Как заставить двигаться стрелку? << На главную или назад  

Мне надо сделать аналоговые часы.. Как нарисовать круг, я понимаю:), а вот как заставить двигаться стрелку??? что за цикл??? помогите плиз..

20 ответов в теме “C# – пишу аналоговые часы. Как заставить двигаться стрелку?”

  1. 13
    Серёга Свинарь ответил:

    ТУПО ЧАСЫ НА ВСЮ ФОРМУ!!!!!!!!!!!!!!

    public class frmClock : Form
    {
    private Timer clkTimer;

    public frmClock()
    {
    clkTimer = new Timer();
    clkTimer.Enabled = true;
    clkTimer.Interval = 1000;
    clkTimer.Tick += new EventHandler(clkTimer_Tick);
    Load += new EventHandler(frmClock_Load);
    Paint += new PaintEventHandler(frmClock_Paint);
    }

    [STAThread]
    static void Main()
    {
    Application.Run(new frmClock());
    }

    private Point RadialPoint(int radius, int seconds)
    {
    Point ptCenter = new Point(this.ClientRectangle.Width/2, this.ClientRectangle.Height/2);
    double angle = -((seconds-15)%60)*Math.PI/30;
    Point ret = new Point(
    ptCenter.X+(int)(radius*Math.Cos(angle)),
    ptCenter.Y-(int)(radius*Math.Sin(angle)));
    return ret;
    }

    private void frmClock_Paint(object sender, PaintEventArgs e)
    {
    DateTime dt = DateTime.Now;
    Graphics g = e.Graphics;
    g.SmoothingMode = SmoothingMode.HighQuality;
    Point ptCenter = new Point(this.ClientRectangle.Width/2, this.ClientRectangle.Height/2);
    int radius = Math.Min(this.ClientRectangle.Width, this.ClientRectangle.Height)/2;
    using(LinearGradientBrush br = new LinearGradientBrush(this.ClientRectangle, Color.White, Color.DarkGray, LinearGradientMode.BackwardDiagonal))
    {
    //br.SetSigmaBellShape(.5f, 1.0f);
    g.FillEllipse(br, ptCenter.X-radius, ptCenter.Y-radius, radius*2, radius*2);
    }
    using(Pen pen = new Pen(Color.Black))
    g.DrawEllipse(pen, ptCenter.X-radius, ptCenter.Y-radius, radius*2, radius*2);

    for(int minute=0; minute<60; minute++)
    {
    Point pt = RadialPoint(radius-10, minute);
    using (SolidBrush br = new SolidBrush(Color.Black))
    {
    if((minute%5)==0)
    g.FillRectangle(br, pt.X-3, pt.Y-3, 6, 6);
    else
    g.FillRectangle(br, pt.X-1, pt.Y-1, 2, 2);
    }
    }

    //draw hours
    using(Pen pen = new Pen(Color.Black, 8))
    {
    pen.StartCap = LineCap.Flat;
    pen.EndCap = LineCap.DiamondAnchor;
    float[] compVals = new float[]{0.0f, 0.2f, 0.5f, 0.7f, 0.9f, 1.0f};
    pen.CompoundArray=compVals;
    g.DrawLine(pen, RadialPoint(15, 30+dt.Hour*5+dt.Minute/12), RadialPoint((int)(radius*0.75), dt.Hour*5+dt.Minute/12));
    }

    // draw minutes
    using(Pen pen = new Pen(Color.FromArgb(100, 0, 0, 0), 6))
    {
    pen.StartCap = LineCap.RoundAnchor;
    pen.EndCap = LineCap.Round;
    g.DrawLine(pen, RadialPoint(15, 30+dt.Minute), RadialPoint((int)(radius*0.8), dt.Minute));
    }

    // draw seconds
    using(Pen pen = new Pen(Color.FromArgb(80, 20, 70, 30), 4))
    {
    pen.CustomEndCap = new AdjustableArrowCap(4, 6, true);
    g.DrawLine(pen, RadialPoint(20, dt.Second+30), RadialPoint(radius-2, dt.Second));
    }
    using(SolidBrush br = new SolidBrush(Color.FromArgb(100, Color.Wheat)))
    g.FillEllipse(br, ptCenter.X-5, ptCenter.Y-5, 10, 10);
    }

    private void clkTimer_Tick(object sender, EventArgs e)
    {
    Text = DateTime.Now.ToLongTimeString()+" – GDI+ Clock";
    Invalidate();
    }

    private void frmClock_Load(object sender, EventArgs e)
    {
    // set control styles for effective double buffering
    SetStyle(ControlStyles.AllPaintingInWmPaint, true);
    SetStyle(ControlStyles.DoubleBuffer, true);
    SetStyle(ControlStyles.UserPaint, true);
    }
    }

  2. 12
    Олег Викторов ответил:

    так то я нарисовал с движением :)
    int angle = 270;
    private void pictureBox1_Paint(object sender, PaintEventArgs e)
    {
    float r = 80.0f;
    float x_centre = 100.0f;
    float y_centre = 100.0f;
    float x, y;
    x = x_centre + r * Convert.ToSingle(Math.Cos(2 * Math.PI * angle / 360));
    y = y_centre + r * Convert.ToSingle(Math.Sin(2 * Math.PI * angle / 360));
    e.Graphics.DrawLine(new Pen(Color.Black, 2), x_centre, y_centre, x, y);
    angle = angle + 6;
    if (angle == 360) angle = 0;

    }

    private void timer1_Tick(object sender, EventArgs e)
    {
    pictureBox2.Refresh();

    }

  3. 11
    Евгений Гаврин ответил:

    ну так используйте)

    запрос в гугле : C# Системное время.

  4. 10
    Олег Викторов ответил:

    Это то Ясно…Вот только проблема…надо использовать СИСТЕМНОЕ время..

  5. 9
    Il Il ответил:

    public partial class Form1 : Form
    {
    const float x0 = 100;
    const float y0 = 100;
    int ticks = 0;
    float alfa = 0;

    public Form1()
    {
    InitializeComponent();
    }

    private void pct01_Paint(object sender, PaintEventArgs e)
    {
    float r = 50;
    float x;
    float y;

    x=x0+r*(float)Math.Cos(alfa);
    y=y0+r*(float)Math.Sin(alfa);

    Graphics gr01 = e.Graphics;
    Pen p01 = new Pen(Color.Red, 5);

    gr01.DrawEllipse(p01, x0-50,x0-50,100, 100);
    gr01.DrawLine(p01, x0, y0, x, y);
    }

    private void timer1_Tick(object sender, EventArgs e)
    {

    ticks += 1;
    if (ticks == 60)
    {
    alfa = 0;
    }
    alfa += (float)0.104719;//угол 6 градусов в радианах
    pct01.Invalidate();
    }
    }

  6. 8
    Il Il ответил:

    делай все заменив на полярную систему координат, связь декартовой и полярной:
    x=R*cos(alfa)
    y=R*sin(alfa)

    R-длина стрелки
    alfa-угол поворота
    x,y-координаты подвижного конеца стрелки

  7. 7
    Леонид Максимов ответил:

    мои аналоговые часы (настоящие) рывком перемещают минутную стрелку каждые 10 секунд, секундная отсутствует. так что идти непрерывно совершенно не обязательно. кроме того, 100 герц не каждый монитор выведет.

    да, и еще.
    в школе как-то писали часы – вчетвером дома у одного из участников поочереди печатали код, которого было очень много: поскольку циклов еще не знали, то для каждого значения секунды был соответствующий If и рисование отрезка с синусами и косинусами :)

  8. 6
    Quizful Team ответил:

    я имел в виду секундную стрелку. А на счет минутной конечно там не так часто заметно будет перемещение

  9. 5
    Quizful Team ответил:

    #5 На сколько я понимаю, что "аналоговые часы" должны визуально непрерывно идти, а не рывками.
    Нужно каждые маленькие промежутки времени, например каждые 10 мс пересчет делать текущего положения стрелки и учитывать поправку на время вычисления углов и отрисовки графики.

  10. 4
    Макс Лавров ответил:

    у тебя 1 точка движется по окружности единичного радиуса, проходя за 1 секунду 360/60 = 6 градусов. вторая точка – в центре. Раз в секуду ты их соединяешь и перерисовываешь форму. Угол задается выражением с синусом и косинусом(точно не помню – погугли). Отсчет – по таймеру

  11. 3
    Борис Осипов ответил:

    Нужны синусы-косинусы и грамотно заданныеуглы)))

  12. 2
    Евгений Гаврин ответил:

    Вам нужно каждый раз по тику таймера перерисовывать область вывода изображения.

  13. 1
    Юрий Плаксунов ответил:

    в таймере

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.