• Thứ Hai, 21/12/2009 10:09 (GMT+7)

    Lập trình ẩn Title bar

    Câu hỏi :
    1. Làm thế nào tắt title bar của form mà vẫn có thể di chuyển và kéo giãn form trong C#.
     Nếu chọn formborderstyle là none thì tắt được thanh title bar nhưng không di chuyển được.
     2. Tôi muốn viết chương trình chat giống Yahoo. Làm thế nào không mất focus trong form đang chat mà vẫn hiển thị tin nhắn - hiển thị bên phải cửa sổ (giống Yahoo).

     

    Trả lời :

    1. Khi người dùng nhấn chuột vào title bar của 1 cửa sổ và kéo đến vị trí khác thì Windows sẽ tự động dời cửa sổ đó về vị trí mới. Đây là chức năng định sẵn của Windows. Tuy nhiên, nếu bạn tắt title bar, người dùng sẽ không còn cơ hội nhấn và kéo chuột trên title bar để di chuyển cửa sổ nữa. Lúc này, nếu muốn người dùng chức năng nhấn và kéo để di dời cửa sổ thì bạn phải lập trình tường minh. Ý tưởng là tạo 3 thủ tục xử lý cho 3 sự kiện về chuột là: MouseDown, MouseUp và MouseMove. Mỗi lần người dùng ấn nút chuột xuống hay thả nút chuột ra, ta sẽ nhớ trạng thái này trong 1 biến luận lý và nhớ vị trí của chuột hiện hành. Mỗi lần người dùng dời chuột đi, ta kiểm tra xem nút chuột đang ấn không, nếu đang ấn thì ta sẽ dời cửa sổ 1 bước (x, y) tương ứng với độ dời của chuột. Cụ thể đoạn code C# cho Form như sau:
     public partial class Form1 : Form {
     //khai báo các thuộc tính cần dùng
     private bool fdown = false;
     private int oldX;
     private int oldY;
     
     //hàm constructor
     public Form1(){
     InitializeComponent();
     //cho Form luôn hiển thị trên tất cả cửa sổ khác
     this.TopMost = true;
     }
     
     //hàm xử lý sự kiện ấn chuột
     private void Form1_MouseDown(object sender, MouseEventArgs e) {
     //nhớ lại toạ độ chuột
     oldX = e.X;
     oldY = e.Y;
     fdown = true;
     }
     //hàm xử lý sự kiện thả chuột
     private void Form1_MouseUp(object sender, MouseEventArgs e) {
     fdown = false;
     }
     
     //hàm xử lý sự kiện dời chuột
     private void Form1_MouseMove(object sender, MouseEventArgs e) {
     //nếu không ấn chuột thì thôi
     if (fdown == false) return;
     //dời cửa sổ theo độ dời của chuột
     this.Top = this.Top + e.Y - oldY;
     this.Left = this.Left + e.X - oldX;
     //nhớ lại toạ độ mới của chuột
     oldX = e.X; oldY = e.Y;
     }
     }

     2. Muốn Form luôn hiển thị trên tất cả các cửa sổ khác, bạn chỉ cần thiết lập thuộc tính TopMost của Form là đủ. Cụ thể đoạn code của hàm khởi tạo Form như sau:
     //hàm constructor
     public Form1(){
     InitializeComponent();
     //cho Form luôn hiển thị trên tất cả cửa sổ khác
     this.TopMost = true;
     }

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