• Thứ Tư, 18/03/2009 10:20 (GMT+7)

    Chương trình hiển thị trên màn hình 25 hình chữ nhật

    Câu hỏi :

    Xin hướng dẫn viết chương trình hiển thị trên màn hình 25 hình chữ nhật, khi nhấn chuột vào 1 hình chữ nhật sẽ đánh dấu x lên đó, nếu nhấn lần nữa thì xoá dấu x. 



    Trả lời :

    Máy tính là thiết bị do con người chế tạo, thay vì thực hiện một vài chức năng cụ thể cho con người như các thiết bị khác, máy tính chỉ có thể thực hiện được một số hữu hạn các chức năng rất nhỏ, mỗi chức năng nhỏ được gọi là lệnh máy, tập hợp các chức năng nhỏ mà máy tính thực hiện được được gọi là tập lệnh máy. Tuy nhiên, máy tính có thể thực hiện tự động danh sách các lệnh máy, danh sách này được gọi là chương trình. Tùy theo chương trình dài ngắn khác nhau và tùy theo trình tự các lệnh được sắp xếp ra sao mà chương trình sẽ giải quyết được bài toán nào. Về lý thuyết, bất kỳ bài toán nào ngoài đời, nếu ta biết rõ thuật giải và miêu tả được thuật giải như là danh sách các lệnh máy rồi đưa vào thì máy tính sẽ chạy để giúp giải bài toán đó. Như vậy, ta nói máy tính là thiết bị đa năng, thiết bị tổng quát, ngược với các thiết bị khác là thiết bị đơn năng cụ thể.

     Tóm lại, vấn đề thiết yếu nhất của việc dùng máy tính (thiết bị đa năng) là lập trình. Lập trình là công việc của con người, là xây dựng chương trình để giải quyết bài toán đặt ra để máy tính chạy giúp. Thí dụ, từ bài toán do bạn đặt ra trong câu hỏi, sau khi phân tích bài toán, bạn thấy chương trình cần thực hiện các vấn đề sau:

     1. Xác định được kích thước của cửa sổ ứng dụng tại từng thời điểm, từ đó xác định kích thước của từng hình chữ nhật cần vẽ và quản lý (thí dụ ta vẽ 25 hình theo qui định gồm 5 hàng, mỗi hàng 5 hình chữ nhật, mỗi hình chữ nhật cách nhau theo chiều ngang và chiều dọc bằng 1 khoảng hở "pad" pixel).

     2. Dùng các hàm vẽ đồ họa của môi trường lập trình để vẽ từng hình chữ nhật lên cửa sổ ứng dụng theo vị trí qui định.

     3. Chờ đợi người dùng ấn chuột ở 1 vị trí nào đó. Khi người dùng ấn chuột, chương trình sẽ xác định vị trí chuột nằm ở đâu: nếu nằm ngoài 25 hình chữ nhật thì không xử lý, còn nếu ấn chuột trong 1 hình chữ nhật thì xác định xem hình chữ nhật nào. Sau khi xác định hình chữ nhật nào thì xử lý hình chữ nhật đó: kiểm tra trạng thái hiện hành xem đã/chưa vẽ dấu x trên nó mà thực hiện việc xóa/vẽ dấu x.

     4. Lặp lại bước 3.
     Sau khi phân tích sơ lược thuật giải cho ứng dụng, nếu dùng ngôn ngữ VB 6.0 hiện thực, ta có qui trình điển hình để viết ứng dụng trên như sau:
     1. Chạy ứng dụng VB 6.0, tạo Project mặc định dạng "Standard EXE" chứa 1 form giao diện.
     2. Chọn menu View.Code để hiển thị cửa sổ soạn code cho ứng dụng, rồi viết đoạn code sau đây:

     'khai báo các biến cần dùng
     Option Explicit
     'biến ma trận trạng thái vẽ từng hình chữ nhật
     Dim RecState(0 To 4, 0 To 4) As Boolean
     'biến miêu tả khoảng hở giữa các hình chữ nhật
     Dim pad As Integer
     'biến miêu tả độ rộng, độ cao hình chữ nhật
     Dim RecWidth As Integer
     Dim RecHeight As Integer
     
     'thủ tục khởi động Form ứng dụng
     Private Sub Form_Load()
     Dim r As Integer
     Dim c As Integer
     Me.ScaleMode = vbPixels
     Me.AutoRedraw = True
     'khởi tạo trạng thái vẽ ban đầu của 25 hình chữ nhật
     For r = 0 To 4
     For c = 0 To 4
     RecState(r, c) = False ' chưa có dấu x
     Next c
     Next r
     'Gọi thủ tục vẽ 25 hình chữ nhật
     Paint
     End Sub
     
     'thủ tục xử lý ấn chuột trên Form
     Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
     Dim r As Integer
     Dim c As Integer
     'tính tọa độ r,c của hình chữ nhật được ấn
     c = X \ (pad + RecWidth)
     r = Y \ (pad + RecHeight)
     'kiểm tra xem user ấn trong hay ngoài hình chữ nhật
     If (r < 5) And (c < 5) And (X Mod (pad + RecWidth) > pad) And (Y Mod (pad + RecHeight) > pad) Then
     'nếu ấn ở trong hình r,c thì đảo trạng thái vẽ của nó
     RecState(r, c) = Not RecState(r, c)
     'tính tọa độ Left,Top của hình chữ nhật
     Left = pad + c * (RecWidth + pad)
     Top = pad + r * (RecHeight + pad)
     ForeColor = RGB(0, 0, 0)
     'vẽ hình chữ nhật
     Line (Left, Top)-(Left + RecWidth, Top + RecHeight), , B
     If RecState(r, c) Then ' vẽ thêm đường x
     ForeColor = RGB(255, 0, 0)
     Line (Left, Top)-(Left + RecWidth, Top + RecHeight)
     Line (Left + RecWidth, Top)-(Left, Top + RecHeight)
     Else
     ' xóa đường x đã vẽ
     ForeColor = BackColor
     Line (Left, Top)-(Left + RecWidth, Top + RecHeight)
     Line (Left + RecWidth, Top)-(Left, Top + RecHeight)
     End If
     End If
     End Sub
     
     'thủ tục vẽ 25 hình chữ nhật ban đầu
     Private Sub Paint()
     Dim r As Integer
     Dim c As Integer
     'thiết lập khoảng hở
     pad = 15
     'xác định kích thước hình chữ nhật theo kích thước Form
     RecWidth = (ScaleWidth - 6 * pad) / 5
     RecHeight = (ScaleHeight - 6 * pad) / 5
     'thiết lập màu vẽ là đen
     ForeColor = RGB(0, 0, 0)
     'vẽ lần lượt 25 hình chữ nhật
     For r = 0 To 4
     For c = 0 To 4
     Left = pad + c * (RecWidth + pad)
     Top = pad + r * (RecHeight + pad)
     Line (Left, Top)-(Left + RecWidth, Top + RecHeight), , B
     Next c
     Next r
     End Sub

     3. Chọn menu Run.Start để chạy thử ứng dụng. Khi ứng dụng chạy, màn hình hiển thị 25 hình chữ nhật, mỗi khi người dùng nhấn chuột vào hình nào ta thấy nó được vẽ lại theo nguyên tắc on/off dấu x bên trong hình chữ nhật đó.

    Chuyên mục: Lập trình