Thứ Tư, 8 tháng 4, 2009

Tạo đồng hồ treo… Desktop

Trong bài viết này, tôi giới thiệu đến bạn cách viết một ứng dụng nhỏ là tạo đồng hồ treo tường đặt trên Desktop để tiện theo dõi thời gian khi làm việc. Học “chay” hoài cũng ngán, tự viết một ứng dụng sẽ giúp ta thấy hứng thú và dễ dàng hơn trong việc nắm bắt các kiến thức mới phải không bạn? Bài viết cũng nêu cách lấy thời gian hệ thống và vẽ hình trong VB.NET.

Công thức tính vị trí kim đồng hồ

Xét hệ trục tọa độ hai chiều qua gốc tọa độ O (gốc kim đồng hồ), điểm T (vị trí đỉnh kim đồng hồ ở thời điểm t) có tọa độ (x,y). Ta cần tính x và y để có thể vẽ được kim đồng hồ. Ở đây, có hai yếu tố xác định được là r (độ dài kim đồng hồ) và a (biết thời gian sẽ biết được a) nên ta tính x, y theo hai yếu tố này (a tính bằng radian):

x = cos(a - Pi/2)*r

y = sin(a - Pi/2)*r


Thiết kế giao diện

Trước tiên, bạn cần một bức hình mặt đồng hồ. Nếu có khả năng về đồ họa, bạn có thể t tạo ra mặt đồng hồ của mình. Riêng tôi thì khả năng đồ họa chỉ ở mức i tờ nên tôi lên Google (www.google.com.vn) tìm kiếm trong mục Image với từ khóa “Clock” để lựa chọn mặt đồng hồ ưng ý cho… chắc ăn.

Bạn mở VB.NET, tạo mới một Windows Application. Bạn thiết lập thuộc tính TopMost của Form là True nếu muốn đồng hồ luôn nằm trên các cửa sổ khác. Bạn có thể cho Form trong suốt (thay đổi độ trong suốt của Form từ 0 đến 100 ở thuộc tính Opacity) để khi đặt đồng hồ trên Desktop, người dùng vẫn thấy nội dung nằm dưới.

Bạn thêm vào Form một PictureBox (tên picClock, thuộc tính Image là bức hình mặt đồng hồ) và một Timer có các thuộc tính:

(Name)

Timer1

Enabled

True

Interval

1000

Phần khai báo

Thiết kế xong giao diện, ta bắt đầu viết mã cho chương trình. Bạn khai báo các hằng sau:

Const Pi As Single = Math.PI ‘Các hàm toán học trong VB.NET được chứa trong thư viện System.Math

Const Phan60VongTron As Single = Pi / 30 ‘Một phút, một giây chiếm 1/60 vòng tròn

Const Phan12VongTron As Single = Pi / 6 ‘Một giờ chiếm 1/12 vòng tròn

Const MotPhanHaiPi As Single = Pi / 2

Ngoài ra bạn cần khai báo các hằng số KimGiay, KimPhut, KimGio là chiều dài các kim đồng hồ, các hằng số TamX, TamY là tọa độ gốc kim đồng hồ (bạn thiết lập cho phù hợp với bức hình mặt đồng hồ).

Các biến sau chứa tọa độ đỉnh các kim đồng hồ:

Dim XGiay, YGiay As Single

Dim XPhut, YPhut As Single

Dim XGio, YGio As Single

Thủ tục Timer1_Tick

Trong thủ tục này, sau mỗi giây (do trị Interval của Timer1 là 1000), ta lấy thời gian hiện tại và tính vị trí mới của các kim đồng hồ.

Các hàm về ngày tháng được VB.NET lưu trong thư viện System.DateTime. Bạn khai báo các biến và lấy thời gian hiện tại như sau:

Dim Giay As Short = Now.Second ‘Viết đầy đủ là System.DateTime.Now.Second

Dim Phut As Short = Now.Minute

Dim Gio As Short = Now.Hour

Kế tiếp là tính tọa độ đỉnh kim giây:

XGiay = Math.Cos(Giay * Phan60VongTron - MotPhanHaiPi) * KimGiay + TamX

YGiay = Math.Sin(Giay * Phan60VongTron - MotPhanHaiPi) * KimGiay + TamY

Đối với kim giờ, ngoài việc xác định vị trí mới theo công thức, chúng ta cần dựa vào số phút để tính khoảng kim giờ di chuyển thêm giữa hai giờ. Cách làm là tính khoảng cách trên các trục tọa độ giữa hai giờ, chia khoảng cách này cho 60 rồi nhân với số phút.

Dim dx As Single = Math.Cos((Gio + 1) * Phan12VongTron - MotPhanHaiPi) * KimGio - Math.Cos(Gio * Phan12VongTron - MotPhanHaiPi) * KimGio

Dim dy As Single = Math.Sin((Gio + 1) * Phan12VongTron - MotPhanHaiPi) * KimGio - Math.Sin(Gio * Phan12VongTron - MotPhanHaiPi) * KimGio

XGio = Math.Cos(Gio * Phan12VongTron - MotPhanHaiPi) * KimGio + Phut * dx / 60 + TamX

YGio = Math.Sin(Gio * Phan12VongTron - MotPhanHaiPi) * KimGio + Phut * dy / 60 + TamY

Bạn xác định vị trí mới của kim phút tương tự kim giờ, hoặc bạn cũng có thể xử lý kim phút như kim giây vì khoảng cách giữa hai phút không lớn lắm.

Sau khi thay đổi tọa độ đỉnh các kim đồng hồ, bạn cần sử dụng lệnh picClock.Refresh() để vẽ lại đồng hồ qua thủ tục picClock_Paint.

Thủ tục picClock_Paint

Thủ tục này để vẽ các kim đồng hồ. VB.NET lưu trữ các hàm về đồ họa trong thư viện System.Drawing, trong đó lớp Pen chứa các thiết lập cho bút vẽ, lớp Color chứa tập hợp màu. Lệnh vẽ đường thẳng (DrawLine) thuộc lớp System.Windows.Forms.PaintEventArgs.Graphics trong sự kiện Paint.

Private Sub picClock_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles picClock.Paint

e.Graphics.DrawLine(New Pen(Color.Red), TamX, TamY, XGiay, YGiay) ‘Vẽ kim giây

e.Graphics.DrawLine(New Pen(Color.Black, 3), TamX, TamY, XPhut, YPhut) ‘Vẽ kim phút

e.Graphics.DrawLine(New Pen(Color.Blue, 4), TamX, TamY, XGio, YGio) ‘Vẽ kim giờ

End Sub

Đến đây, bạn đã có một đồng hồ treo… Desktop rồi đấy. Bạn nhấn Ctrl-F5 để xem kết quả như thế nào?

Ngô Bảo Khoa

Thế giới @ 82

Không có nhận xét nào:

Đăng nhận xét