برنامه زیر برنامه ساعت آنالوگ و عقربه ای است :
توجه شود که خود ساعت ، عقربه هایش عکس هستند و عکس ها Transparent هستند .
برای طراحی عقربه ها چون anchor در #C به صورت Top و Left است ، در هنگام طراحی عکس ها ، عقربه
ها باید به سمت چپ ترین یال عکس بچسبند، یعنی باید در گوشه قرار بگیرند :
عقربه هم به همین شکل بالا در گوشه سمت چپ عکس قرار گرفته اند.
برای پیدا کردن میزان چرخش باید دقت شود.
برای پیدا کردن چرخش دقیقه شمار :
می خواهیم 60 دقیقه را در یک دایره 360 درجه ای قرار دهیم ، پس با تقسیم 360 بر 60 ، خواهیم دانست
که هر دقیقه به 6 درجه چرخش نیاز دارد.
برای پیدا کردن چرخش ثانیه شمار :
می فهمیم که ، به ازای یک ثانیه ، باید 6 درجه بچرخد .
برای پیدا کردن چرخش ساعت شمار :
ساعت شمار که واضح است باید به ازای هر ساعت 30 درجه بچرخد .چون در صفحه 12 ساعت داریم.
پس با تقسیم 360 بر 12 می فهمیم که باید 30 درجه به ازای هر ساعت چرخید. اما ساعت شمار
به صورت آرام آرام با دقیقه شمار تغییر میکند ، مثلا ساعت اگر 8:56 باشد ، ساعت شمار باید خیلی نزدیک
به عدد 9 باشد، پس ما باید ، پارامتری دیگر برای دقیق کردن چرخش ساعت شمار در نظر بگیریم.
ما باید میزان تغییر ساعت شمار را به ازای یک دقیقه نیز بدست بیاوریم و به چرخش اضافه کنیم.
برای اینکار ، می دانیم که 12 ساعت برابر با 720 دقیقه است . 720 دقیقه را میخواهیم در 360 درجه
جای دهیم ، پس با تقسیم 360 بر 720 می دانیم که ساعت شمار به ازای هر دقیقه ، نیم درجه چرخش دارد.
که این میزان باید به چرخش اصلی ساعت شمار اضافه گردد.
پس برای بدست آوردن چرخش ها :
private void timer1_Tick(object sender, EventArgs e)
{
theta_second = (int)DateTime.Now.Second * 6;
theta_minute = (int)DateTime.Now.Minute * 6;
theta_hour = (int)DateTime.Now.Hour * 30 +
(int)DateTime.Now.Minute / 2;
this.Invalidate();
}
و برای مثال برای چرخش عقربه ثانیه داریم :
int x = center_x;
int y = center_y;
second_hand = Properties.Resources.second_hand;
e.Graphics.TranslateTransform(x, y);
e.Graphics.RotateTransform(theta_second - 180);
e.Graphics.TranslateTransform(-x, -y);
e.Graphics.DrawImage(second_hand, new Point(center_x, center_y));
second_hand.Dispose();
همگان می دانیم که کد بالا ، مرکز دوران را به وسط فرم می آورد و به اندازه تتا میچرخاند و چون در فرم ،
مختصات بر عکس میباشد ، یک flip با کم کردن 180 از theta انجام میدهیم.
نکته : متد this.Invalidate رویداد Paint را فراخوانی میکند.
نظرات شما عزیزان: