Мне надо сделать аналоговые часы.. Как нарисовать круг, я понимаю:), а вот как заставить двигаться стрелку??? что за цикл??? помогите плиз..
Мне надо сделать аналоговые часы.. Как нарисовать круг, я понимаю:), а вот как заставить двигаться стрелку??? что за цикл??? помогите плиз..
Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.
17 мая 2009 в 22:03
ТУПО ЧАСЫ НА ВСЮ ФОРМУ!!!!!!!!!!!!!!
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);
}
}
17 мая 2009 в 14:05
так то я нарисовал с движением
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();
}
17 мая 2009 в 13:03
ну так используйте)
запрос в гугле : C# Системное время.
17 мая 2009 в 12:04
Это то Ясно…Вот только проблема…надо использовать СИСТЕМНОЕ время..
17 мая 2009 в 2:03
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();
}
}
17 мая 2009 в 2:00
делай все заменив на полярную систему координат, связь декартовой и полярной:
x=R*cos(alfa)
y=R*sin(alfa)
R-длина стрелки
alfa-угол поворота
x,y-координаты подвижного конеца стрелки
17 мая 2009 в 0:01
мои аналоговые часы (настоящие) рывком перемещают минутную стрелку каждые 10 секунд, секундная отсутствует. так что идти непрерывно совершенно не обязательно. кроме того, 100 герц не каждый монитор выведет.
да, и еще.
в школе как-то писали часы – вчетвером дома у одного из участников поочереди печатали код, которого было очень много: поскольку циклов еще не знали, то для каждого значения секунды был соответствующий If и рисование отрезка с синусами и косинусами
17 мая 2009 в 0:01
я имел в виду секундную стрелку. А на счет минутной конечно там не так часто заметно будет перемещение
16 мая 2009 в 22:03
#5 На сколько я понимаю, что "аналоговые часы" должны визуально непрерывно идти, а не рывками.
Нужно каждые маленькие промежутки времени, например каждые 10 мс пересчет делать текущего положения стрелки и учитывать поправку на время вычисления углов и отрисовки графики.
16 мая 2009 в 20:04
у тебя 1 точка движется по окружности единичного радиуса, проходя за 1 секунду 360/60 = 6 градусов. вторая точка – в центре. Раз в секуду ты их соединяешь и перерисовываешь форму. Угол задается выражением с синусом и косинусом(точно не помню – погугли). Отсчет – по таймеру
16 мая 2009 в 18:01
Нужны синусы-косинусы и грамотно заданныеуглы)))
16 мая 2009 в 17:05
Вам нужно каждый раз по тику таймера перерисовывать область вывода изображения.
16 мая 2009 в 17:05
в таймере