Số 55
HỒ LÔ BIẾN

Tự tạo Screen Saver cho mùa Giáng sinh

NGÔ BẢO KHOA (TB - TP.HCM)

Tự tạo screensaver

Screen Saver là loại phần mềm "bảo vệ màn hình" bằng cách "diễn trò" khi người dùng để máy tính rảnh rỗi quá một thời gian định trước nào đó. Hiện nay, màn hình máy tính thực sự không cần Screen Saver "bảo vệ". Tuy nhiên, Screen Saver vẫn được mọi người yêu thích như một phương tiện... thư giãn, và... màu mè.

Bằng Visual Basic, bạn có thể tự tạo một Screen Saver. “Ta về ta tắm ao ta, dù trong dù đục ao nhà vẫn hơn”. Dùng chương trình do chính mình viết vẫn thú vị hơn, phải không bạn? Sau đây là các bước để tạo một Screen Saver bằng Visual Basic.

1. Trước tiên, bạn tạo một dự án (project) mới thuộc loại Standard exe, thêm 2 biểu mẫu (form) mang tên frmScreenSaver và frmSetting với thuộc tính Visible đều là False. Các thuộc tính của frmScreenSaver được trình bày ở bảng 1.

Bảng 1

(Name)

frmScreenSaver

Appearance

0 ‘Flat

BackColor

Black

BorderStyle

0 ‘None

ControlBox

0 ‘False

MaxButton

0 ‘False

MinButton

0 ‘False

ShowInTaskbar

0 ‘False

Visible

0 ‘False

WindowsState

2 ‘Maximized

Những thuộc tính trên đảm bảo cho biểu mẫu frmScreenSaver hiện ra với một màu đen chiếm hết màn hình.

2. Bạn thêm vào dự án một đơn thể (module) mang tên modMain. Từ trình đơn Project, bạn chọn Project Properties > Startup Object > Sub Main. Trong đơn thể modMain, bạn viết mã như sau:

Public Sub Main()
 

End Sub

Khi chạy chương trình, những lệnh được xử lý trước tiên là những lệnh trong Sub Main()

3. Trong Screen Saver, con trỏ chuột cần được giấu đi. Để giấu đi hay hiện lại con trỏ chuột, bạn dùng hàm API trong thư viện user32.dll. Cụ thể, ta giấu con trỏ chuột khi bắt đầu chạy chương trình và cho hiện lại con trỏ chuột khi chấm dứt chương trình bằng cách thêm dòng sau trên dòng Sub Main():

Public Declare Function _

ShowCursor Lib "user32" _
(ByVal bShow As Long) As Long

4. Khi Windows làm việc với Screen Saver, nó gửi cho Screen Saver những tham số đặc biệt để điều khiển. Ví dụ, để chạy Screen Saver, Windows gửi tham số “/s”. Khi muốn hiển thị phần Setting của Screen Saver, Windows gửi tham số “/c”. Bạn phải viết thêm vào thủ tục Main như ở đoạn mã 1, theo đó, sau khi nhận được tham số do Windows gửi tới, chương trình của ta cho hiện ra biểu mẫu tương ứng.

Đoạn mã 1:

Public Sub Main()

If InStr(Command, "/s") > 0 Then
ShowCursor False
frmScreenSaver.Show 1
End If

If InStr(Command, "/c") > 0 Then
frmSetting.Show 1
End If

End Sub
[Đầu trang]

5. Khi Screen Saver đang chạy, nếu người dùng di chuyển chuột, ấn chuột hay ấn phím thì chương trình phải chấm dứt. Vì vậy bạn cần thêm một thủ tục mang tên EndScreenSaver vào cuối đơn thể modMain (sau thủ tục Main):

Public Sub EndScreenSaver()
ShowCursor True
End
End Sub

6. Chuyển qua frmScreenSaver, bạn cần viết mã lệnh xư lý các sự kiện ấn phím, ấn chuột và di chuyển chuột. Khi xảy ra một trong các sự kiện đó, ta gọi thủ tục EndScreenSaver để chấm dứt Screen Saver (đoạn mã 2).

Đoạn mã 2:

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
EndScreenSaver
End Sub

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
EndScreenSaver
End Sub

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Static OldX, OldY As Integer
If (OldX > 0 And OldY > 0) And (Abs(X - OldX) > 5 Or Abs(Y - OldY) > 5) Then
EndScreenSaver
End If
OldX = X
OldY = Y
End Sub

7. Screen Saver cần tạo ra những hình ảnh chuyển động liên tục và lặp lại, một dòng chữ chạy liên tục qua màn hình giống như Scrolling Marquee có sẵn trong Windows chẳng hạn. Đây chính là "đất dụng võ" để bạn tự do thể hiện những kỹ thuật lập trình của mình. Bạn hãy đặt lên biểu mẫu frmScreenSaver một Timer mang tên Timer1, đặt trị cho thuộc tính Interval và viết mã cho nó.

Private Sub Timer1_Timer()
   ‘ Ở đây là phần mã của bạn để
   ‘ tạo ra hình ảnh chuyển động
   ‘ cho Screen Saver
End Sub

Bạn lưu ý, chương trình Screen Saver chỉ chạy khi có tham số “/s” hoặc “/c”. Để dễ dàng chạy thử nghiệm, bạn có thể tạm thời che đi (comment out) các câu lệnh điều kiện kiểm tra tham số. Dĩ nhiên, trước khi biên dịch chương trình bạn phải bày ra trở lại.

Biểu mẫu frmSetting là biểu mẫu để bạn viết phần thiết lập tùy chọn cho Screen Saver của mình.

8. Cuối cùng, để tạo Screen Saver hoàn chỉnh, bạn chọn File > Make Project1.exe. Bạn lưu ý, khi đặt tên tập tin trên hộp thoại, bạn phải sửa phần mở rộng thành .scr (chứ không phải .exe). Sau đó bạn chép tập tin vừa tạo ra (Project1.scr) vào thư mục Windows. Từ đó, bạn có thể kích hoạt Screen Saver của mình như từng làm với mọi Screen Saver khác.

Chúc mừng Giáng Sinh!

Nhân dịp Giáng Sinh 2003, ta hãy tạo ra một Screen Saver với hình ảnh bầu trời mùa đông đầy tuyết rơi, bạn đồng ý không?

Bạn cần có một PictureBox chứa bức tranh Giáng Sinh (như hình 1 chẳng hạn) để làm nền cho cảnh tuyết rơi. Bạn thêm PictureBox vào frmScreenSaver với các thuộc tính như bảng 2.

Bảng 2

(Name)

Picture1

Appearance

0 – Flat

AutoRedraw

True

AutoSize

True

BorderStyle

0 – None

Picture

Bạn chỉ ra nơi chứa bức tranh của bạn

ScaleMode

3 – Pixel

[Đầu trang]

Với Timer1 trong frmScreenSaver, bạn đặt thuộc tính Interval là 100, Enabled là False.
Một hạt tuyết cần có các thuộc tính:
- x, y : tọa độ hiện thời của hạt tuyết.
- size : kích thước của hạt tuyết.
- speed : tốc độ rơi của hạt tuyết.

Bạn có nhiều hạt tuyết và mỗi hạt tuyết có các thuộc tính riêng của nó. Vì vậy, ta cần một mảng (array) để lưu giữ các thuộc tính của từng hạt tuyết. Bạn hãy thêm đoạn mã 3 vào đầu phần mã của frmScreenSaver, trong đó ta tạo ra mảng để chứa 500 "hạt tuyết" Snow. Đoạn mã 4 trình bày thủ tục CreateSnow của frmScreenSaver để tạo ra các hạt tuyết với vị trí, kích thước và tốc độ ngẫu nhiên. Ta gọi thủ tục CreateSnow trong thủ tục Form_Load của frmScreenSaver (đoạn mã 5).

Đoạn mã 3:

Private Type Snow
   x As Integer 'Tọa độ ngang
   y As Integer 'Tọa độ dọc
   size As Integer 'Kích thước hạt tuyết
   speed As Integer 'Tốc độ tuyết rơi
End Type
   ‘ 500 là số lượng hạt tuyết.
   ‘ Bạn thay đổi tùy thích.
Dim SnowArr(1 To 500) As Snow

Đoạn mã 4:

Private Sub CreateSnow(i As Integer)
   SnowArr(i).X = Int(Rnd * Picture1.ScaleWidth)
   ‘Tọa độ y ban đầu của hạt tuyết sẽ ở phần trên
   ‘của bức tranh, thay đổi từ 0 đến 49 pixel.
   SnowArr(i).Y = (Rnd * 50)
   ‘Tốc độ thay đổi từ 1 đến 3 pixel
   SnowArr(i).speed = Int(Rnd * 3) + 1
   ‘Kích thước thay đổi từ 1 đến 3 pixel
   SnowArr(i).size = Int(Rnd * 3) + 1
End Sub

Đoạn mã 5:

Private Sub Form_Load()
 Dim i As Integer
 For i = 1 To UBound(SnowArr)
   CreateSnow i
   ‘Dòng lệnh này làm cho lúc đầu tuyết trải
   ‘khắp bức tranh chứ không chỉ ở phần trên.
   SnowArr(i).y = Int(Rnd * Picture1.ScaleHeight)
  Next i
   ‘Ta chỉ cho Timer1 hoat động khi đã gán trị
   ‘cho các phần tử của mảng SnowArr.
 Timer1.Enabled = True
End Sub

Để vẽ hạt tuyết trên Picture1, bạn dùng phương thức Pset của đối tượng Picture1 với tọa độ là hai thuộc tính x và y của Snow. Để xác định kích thước cho hạt tuyết, trước khi vẽ hạt tuyết, bạn thay đổi thuộc tính DrawWidth của Picture1 bằng thuộc tính size của Snow. Sau khi vẽ hạt tuyết trên Picture1, bạn thay đổi thuộc tính y của Snow thành y + speed. Như vậy sau một khoảng thời gian bằng trị Interval của Timer1, chương trình sẽ vẽ lại các hạt tuyết với tung độ khác. Điều này làm cho bạn thấy các hạt tuyết rơi xuống với tốc độ khác nhau. Ta thể hiện ý định này qua thủ tục Timer1_Timer() ở đoạn mã 6.

Đoạn mã 6:

Private Sub Timer1_Timer()
 Dim i As Integer
  Picture1.Cls
  For i = 1 To UBound(SnowArr)
    Picture1.DrawWidth = SnowArr(i).size
    ‘Tuyết dĩ nhiên là màu trắng rồi !
   Picture1.PSet (SnowArr(i).x, SnowArr(i).y), QBColor(15)
    SnowArr(i).y = SnowArr(i).y + SnowArr(i).speed
    ‘Khi tuyết “rơi” ra khỏi bức tranh thì đưa nó
    ‘lên đầu bức tranh với vị trí ngẫu nhiên.
    If SnowArr(i).y > Picture1.ScaleHeight Then
        CreateSnow i
  Next i
End Sub

Trong frmScreenSaver, bạn cũng cần thêm thủ tục xử lý sự kiện di chuyển chuột hay ấn chuột trên Picture1. Khi xảy ra sự kiện như vậy, bạn gọi thủ tục EndScreenSaver để thoát.

Cuối cùng, trong modMain, bạn cần viết thêm vào thủ tục Main (đoạn mã 7) để căn bức tranh ở giữa màn hình.

Đoạn mã 7:

Public Sub Main()
If InStr(Command, "/s") > 0 Then
  ShowCursor False
  With frmScreenSaver
   .Show
   ‘Sau khi frmScreenSaver.Show được gọi, hai thuộc
   ‘tính Width và Height của frmScreenSaver mới đúng
   ‘là chiều rộng và chiều cao màn hình của bạn.
   .Picture1.Left = (.Width - .Picture1.Width) / 2
   .Picture1.Top = (.Height - .Picture1.Height) / 2
End With
End If

If InStr(Command, "/c") > 0 Then
   frmSetting.Show 1
End If
End Sub

Thế là bạn đã hoàn thành Screen Saver tạo cảnh tuyết rơi. Bạn có thể tham khảo mã nguồn hoàn chỉnh của tôi tại www.echip.com.vn. Bạn nên viết vào frmSetting để thiết lập nhiều tùy chọn cho người dùng thoải mái điều chỉnh. Muốn chương trình hay hơn, bạn có thể thêm các bài nhạc Giáng sinh. Chúc bạn tự tạo được một Screen Saver thật ấn tượng cho mùa Giáng sinh năm nay!

[Đầu trang]
Trang chủ
Thư ngỏ
Nội lực "Peter Pan"
Cầu nối Intel Việt Nam
Chuyện trong tuần
Nhóm Frontpage
Cõi người ta
Kim cương doanh nghiệp
Bình luận thị trường
Cõi Mô-bai
Chuyên đề
Bổ ngửa
Nuôi hồn Robot
Túi càn khôn IT
Hồ lô biến
Cảm về Game
Nhật ký e-CHÍP
Bản quyền VASC Orient, Công ty phát triển phần mềm VASC
99 Triệu Việt Vương HN; Tel: (04) 9782235 • email: echip@vasc.com.vn