Từ 1 tới 9 trên tổng số 9 kết quả

Đề tài: làm sao để di chuyển form (, control trong form) không cần tới titleBar ?

  1. #1
    Ngày gia nhập
    08 2017
    Bài viết
    1,942

    Mặc định làm sao để di chuyển form (, control trong form) không cần tới titleBar ?

    Trong vài trường hợp, thực tế nhiều ứng dụng thiết kế khác chuẩn của windows, không dùng title bar có sẵn.

    Làn sao di chuyển nó trong monitor ? Không giới hạn hay nhất thiết phải viết bằng c/c++.

  2. #2
    Ngày gia nhập
    02 2014
    Nơi ở
    TP.HCM
    Bài viết
    867

    Thực sự là giao diện ứng dụng thiết kế cho HĐH nào (Windows, Linus, ...) thì thật khó mà xác định nó được. Trong vài ngôn ngữ phổ dụng viết để chạy trên Windows thì VB,C# hay C++ vẫn dùng phương pháp chặn thộng điệp hittest chuột Client là êm đẹp. Cách thì cũng có các cách khác nhưng hiệu suất của thao tác kéo cửa sổ không mượt mà cho lắm. Ví dụ : Nếu ta lưu trạng thái chuột nhấn trên cửa sổ; xử lý sự kiện chuột di chuyển để di chuyển cửa sổ (form) bằng các lệnh di chuyển; thì cửa sổ (form) rất dễ bị nháy hình. Hoặc nếu chúng ta dùng một phím nào đó chung với các lệnh di chuyển để di chuyển form thì tình trạng trên cũng dễ xảy ra.

    Trong đề tài này thì làm việc trên monitor hay trên một màn hình là như nhau. (Nếu chặn hittest)

  3. #3
    Ngày gia nhập
    07 2011
    Nơi ở
    Moscow-Russia
    Bài viết
    140

    Với C++ thì theo giải pháp của MHoang tại: http://diendan.congdongcviet.com/threads/t425837::ban-nao-co-the-cho-minh-biet-lam-sao-de-tao-mot-form-khong-tieu-de-di-chuyen-duoc-bang-cpp-khong-khong-dung-net.cpp?p=941547#post941547

    Còn người thích C# như mình thì giải pháp theo code sau:

    Visual C# Code:
    1.         private void Form1_MouseDown(object sender, MouseEventArgs e)
    2.         {
    3.             if (e.Button == MouseButtons.Left)
    4.             {
    5.                 this.Capture = false;
    6.  
    7.                 const int WM_NCLBUTTONDOWN = 0x00A1;
    8.                 const int HTCAPTION = 2;
    9.                 Message msg = Message.Create(this.Handle,
    10.                                              WM_NCLBUTTONDOWN,
    11.                                              new IntPtr(HTCAPTION),
    12.                                              IntPtr.Zero);
    13.                 this.DefWndProc(ref msg);
    14.             }
    A good beginning and a good ending !

  4. #4
    Ngày gia nhập
    08 2017
    Bài viết
    1,942

    Có nhiều cách làm. Một ví dụ hoàn chỉnh sử dụng HTCLIENT ==> HTCAPTION, trong c#, biên dịch
    csc /t:winexe Form1.cs

    Visual C# Code:
    1. using System;
    2. using System.Windows.Forms;
    3.  
    4. namespace Demo {
    5.     public partial class Form1 : Form {
    6.         public Form1() {
    7.             //InitializeComponent();
    8.         }
    9.        
    10.         protected override void WndProc(ref Message m){
    11.             switch (m.Msg){
    12.                 case 0x84: //WM_NCHITTEST
    13.                     base.WndProc(ref m);
    14.                     if ((int)m.Result == 0x1)   //HTCLIENT
    15.                         m.Result = (IntPtr)0x2; //HTCAPTION
    16.                     return;
    17.             }
    18.             base.WndProc(ref m);
    19.         }
    20.        
    21.         [STAThread]
    22.         static void Main() {
    23.             Application.Run(new Form1());
    24.         }
    25.     }
    26. }

    Cho phép dùng ngôn ngữ khác, xin tiếp tục.

  5. #5
    Ngày gia nhập
    02 2014
    Nơi ở
    TP.HCM
    Bài viết
    867

    Đồng ý với monre, chỉ là cú pháp theo ngôn ngữ, không có nhiều khác biệt lắm.

  6. #6
    Ngày gia nhập
    08 2017
    Bài viết
    1,942

    Mặc định làm sao để di chuyển form (, control trong form) không cần tới titleBar ?

    Không hẳn thế, có thể giống, có thể khác
    Visual C# Code:
    1. using System;
    2. using System.Windows.Forms;
    3. using System.Runtime.InteropServices;
    4.  
    5. //csc /t:winexe Form2.cs
    6.  
    7. namespace Demo {
    8.     public partial class Form2 : Form {
    9.         public Form2() {
    10.             //InitializeComponent();
    11.             this.MouseDown += f_MouseDown;
    12.         }
    13.         void f_MouseDown(object sender, MouseEventArgs e){
    14.             const int WM_NCLBUTTONDOWN = 0xA1;
    15.             const int HT_CAPTION = 0x2;
    16.             if (e.Button == MouseButtons.Left){
    17.                 ReleaseCapture();
    18.                 SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
    19.             }
    20.         }
    21.         [DllImportAttribute("user32.dll")]
    22.         static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
    23.         [DllImportAttribute("user32.dll")]
    24.         static extern bool ReleaseCapture();   
    25.        
    26.         /*
    27.         protected override void WndProc(ref Message m){
    28.             switch (m.Msg){
    29.                 case 0x84: //WM_NCHITTEST
    30.                     base.WndProc(ref m);
    31.                     if ((int)m.Result == 0x1)   //HTCLIENT
    32.                         m.Result = (IntPtr)0x2; //HTCAPTION
    33.                     return;
    34.             }
    35.             base.WndProc(ref m);
    36.         }
    37.         */
    38.        
    39.         [STAThread]
    40.         static void Main() {
    41.             Application.Run(new Form2());
    42.         }
    43.     }
    44. }

  7. #7
    Ngày gia nhập
    12 2015
    Nơi ở
    Đà Nẵng
    Bài viết
    407

    Các bài viết hay quá
    Nếu là mình thì mình chỉ nghĩ ra cách lưu trạng thái nhấn chuột và xử lí sự kiện di chuyển chuột như MHoang nói bên trên
    Không ngờ lại có cách xử lí thông điệp như vậy, và với cách này ta cũng có thể code tính năng chỉnh kích thước cửa sổ nữa, đúng không, bằng cách thay HTCAPTION thành HTBOTTOMRIGHT

  8. #8
    Ngày gia nhập
    08 2017
    Bài viết
    1,942

    hay dở là cảm giác nhất thời.

    không chỉ có xi hay xáp mới làm được

  9. #9
    Ngày gia nhập
    08 2017
    Bài viết
    1,942

    Có thể xem firefox là ví dụ điển hình cho topic này


Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn