Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 11 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
    2,497

    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
    897

    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
    2,497

    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
    897

    Đồ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
    2,497

    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
    414

    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
    2,497

    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
    2,497

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


  10. #10
    Ngày gia nhập
    08 2017
    Bài viết
    2,497

    Đây là ví dụ demo Move Control, kéo Button trong Form


    Pas Code:
    1. type
    2.   TForm1 = class(TForm)
    3.   ...
    4.   private
    5.     { Private declarations }
    6.     Dragged: Boolean;
    7.     OldPos: TPoint;
    8.   ...
    9.  
    10. procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
    11.   Shift: TShiftState; X, Y: Integer);
    12. begin
    13.   if RadioGroup1.ItemIndex=0 then
    14.   begin
    15.     Dragged:=True;
    16.     GetCursorPos(OldPos);
    17.     SetCapture(Button1.Handle);
    18.   end;
    19. end;
    20.  
    21. procedure TForm1.Button1MouseMove(Sender: TObject; Shift: TShiftState; X,
    22.   Y: Integer);
    23. var
    24.   NewPos: TPoint;
    25. begin
    26.   if Dragged then
    27.     with Button1 do
    28.     begin
    29.       GetCursorPos(NewPos);
    30.       Left:=Left-OldPos.X+NewPos.X;
    31.       Top:=Top-OldPos.Y+NewPos.Y;
    32.       OldPos:=NewPos;
    33.     end;
    34. end;
    35.  
    36. procedure TForm1.Button1MouseUp(Sender: TObject; Button: TMouseButton;
    37.   Shift: TShiftState; X, Y: Integer);
    38. begin
    39.   if Dragged then
    40.   begin
    41.     ReleaseCapture;
    42.     Dragged:=False;
    43.   end;
    44. end;

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