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

    Lập trình xử lý chuột phải

    Câu hỏi :
    Xin hướng dẫn viết chương trình C#, khi nhấn và giữ chuột (Left_Mouse) trên 1 button thì thay đổi con số liên tục trong 1 control khác; dường như các sự kiện chuột của button không có tác dụng.



    Trả lời :
    Không như bạn nghĩ, thực ra các sự kiện về chuột như MouseDown, MouseUp,.. kết hợp với button (hay với bất kỳ đối tượng nào khác) đều hoạt động tốt. Vấn đề là bạn chưa biết cách sử dụng hợp lý thôi. Thí dụ muốn giải quyết vấn đề của bạn, bạn có thể tạo 2 hàm xử lý sự kiện ấn và thả chuột trái, mỗi lần ấn chuột bạn thiết lập giá trị TRUE cho 1 biến nhớ, mỗi lần thả chuột bạn thiết lập lại giá trị FALSE cho biến nhớ đó. Như vậy, mỗi khi bạn đọc biến nhớ, bạn sẽ biết tình trạng đang ấn hay thả chuột, từ đó quyết định thực hiện công việc xác định (trong trường hợp của bạn là hiệu chỉnh giá trị trong 1 điều khiển khác). Để kiểm tra thường xuyên biến nhớ, bạn có thể nhờ đối tượng Timer đếm dùm thời gian, mỗi khi timeout bạn sẽ kiểm tra biến nhớ và nếu thấy chuột vẫn còn được ấn, bạn hiệu chỉnh giá trị trong control mong muốn. Cụ thể qui trình xây dựng ứng dụng C# nhỏ demo việc thực hiện yêu cầu của bạn như sau:
     1. Chạy Visual Studio .Net, tạo Project C# dạng "Windows Application".
     2. Khi Form giao diện của ứng dụng hiển thị, hãy vẽ 3 đối tượng sau vào Form: 1 button có Name = button1 (tên mặc định), textbox có Name = textbox1 (tên mặc định) và Timer có Name = Timer1 (tên mặc định). Lưu ý, sau khi vẽ Timer vào Form, nó không hiển thị trong Form.
     3. Chọn button "button1" để hiển thị cửa sổ thuộc tính của nó, chọn tag "Events" để hiển thị danh sách các sự kiện kết hợp với button. Duyệt trong danh sách và tạo lần lượt 2 hàm xử lý sự kiện cho 2 sự kiện MouseDown và MouseUp với tên mặc định lần lượt là button1_MouseDown và button1_MouseUp.
     4. Trong cửa sổ thuộc tính, chọn Timer1, chọn tag "Events" để hiển thị danh sách các sự kiện kết hợp với Timer, ấn kép chuột vào vùng giá trị của sự kiện Tick để tạo hàm xử lý sự kiện Timeout.
     5. Viết code cho 3 hàm vừa tạo:
     namespace MouseDown {
     public partial class Form1 : Form {
     //định nghĩa các thuộc tính cần dùng
     bool fmousedown = false;
     int i = 0;
     public Form1(){
     InitializeComponent();
     }
     //hàm xử lý MouseDown trên button
     private void button1_MouseDown(object sender, MouseEventArgs e){
     //gán giá trị true vào biến nhớ
     fmousedown = true;
     //thực hiện việc hiệu chỉnh số trong TextBox
     textBox1.Text = i.ToString();
     i++;
     //thiết lập chu kỳ đếm là 100ms
     timer1.Interval = 100;
     //bắt đầu cho Timer đếm
     timer1.Start();
     }
     //hàm xử lý MouseUp trên button
     private void button1_MouseUp(object sender, MouseEventArgs e){
     //gán giá trị false vào biến nhớ
     fmousedown = false;
     //dừng Timer
     timer1.Stop();
     }
     //hàm xử lý sự kiện timeout
     private void timer1_Tick(object sender, EventArgs e){
     //kiểm tra xem còn ấn chuột không
     if (fmousedown) {
     //nếu còn, thực hiện việc hiệu chỉnh số trong TextBox
     textBox1.Text = i.ToString();
     i++;
     }
     }
     }
     }
     6. Chọn menu Debug.Start Debuging để chạy thử ứng dụng, mỗi lần bạn ấn và giữ button, giá trị trong TextBox sẽ được hiệu chỉnh liên tục theo tốc độ Timer đến khi bạn thả chuột.
    Chuyên mục: Lập trình