2013-03-11 48 views
5

tôi đang tìm kiếm mẹo để lấy tên biểu mẫu khi chuột đặt trên đó. giả sử tôi có một hình thức mdi và nhiều hình thức sdi như form1, form2, form3 và tất cả các hình thức sdi được mở ra. giả sử tôi có một bộ đếm thời gian chạy trên form1 và sẽ chạy theo định kỳ. tôi muốn hiển thị tên biểu mẫu trên nhãn của form1 từ sự kiện đánh dấu thời gian khi chuột được định vị trên bất kỳ cửa sổ biểu mẫu SDI nào.Cách phát hiện tên biểu mẫu khi chuột ở bất kỳ hình thức SDI nào

cách này tôi cố gắng thực hiện. đây là mã số

private void timer1_Tick(object sender, EventArgs e) { 
    var handle = WindowFromPoint(Cursor.Position); 
    if (handle != IntPtr.Zero) { 
     var ctl = Control.FromHandle(handle); 
     if (ctl != null) { 
      label1.Text = ctl.Name; 
      return; 
     } 
    } 
    label1.Text = "None"; 
} 

[System.Runtime.InteropServices.DllImport("user32.dll")] 
private static extern IntPtr WindowFromPoint(Point pos); 

mã trên chạy hoàn toàn nhưng có một số trục trặc. khi tôi đặt chuột vào mẫu MDI hoặc trên Form1 thì tên biểu mẫu được hiển thị trên form1 nhưng khi tôi đặt chuột lên Form2 hoặc Form2 thì tên của chúng không hiển thị. tôi không thể hiểu được vấn đề trong mã này là gì. hãy hướng dẫn tôi sửa nó.

+1

Ý anh là gì bởi "chuột là vào nó"? Bạn có nghĩa là lơ lửng trên nó, mà không nhất thiết phải kích hoạt các hình thức, hoặc rằng hình thức là hình thức hoạt động trong số các trẻ em, tức là một trong đó đã tập trung? –

+0

Tôi đã chỉnh sửa tiêu đề của bạn. Vui lòng xem, "[Câu hỏi có nên bao gồm" thẻ "trong tiêu đề của họ không?] (Http://meta.stackexchange.com/questions/19190/)", trong đó sự đồng thuận là "không, họ không nên". –

Trả lời

1

Vì bạn có sự kiểm soát, tôi nghĩ rằng bạn chỉ cần sử dụng chức năng FindForm():

var ctl = Control.FromHandle(handle); 
if (ctl != null) { 
    var form = ctrl.FindForm(); 
    if (form != null) { 
    label1.Text = form.Name; 
    } 
} 
+0

FindForm() làm gì? – Thomas

+0

@Thomas Nó sẽ trả về cá thể biểu mẫu cho phụ huynh của điều khiển. Xem [Control.FindForm Method] (http://msdn.microsoft.com/en-us/library/system.windows.forms.control.findform.aspx). Nó giống như những gì bạn đang cố gắng làm với mã của bạn. Nó không rõ ràng nếu bạn muốn "tên" của biểu mẫu, hoặc "văn bản" (tiêu đề) của biểu mẫu. Đối với tiêu đề, thay thế 'form.Name' bằng' form.Text'. – LarsTech

0

Lý do tên Form2 không hiển thị là trường hợp của Form2 mà bạn đã tạo không có tên. Để chứng minh điều này, hãy xem khối mã sau, nằm trong tệp Program.cs:

MDIParent mdi = new MDIParent(); 
Form1 frm1 = new Form1(); 
frm1.MdiParent = mdi; 
Form2 frm2 = new Form2(); 
frm2.MdiParent = mdi; 
frm1.Show(); 
frm2.Show(); 
Application.Run(mdi); 

Nếu bạn thêm điểm ngắt, bạn sẽ thấy tên Form2 trống. Nhưng xin chờ chút nữa!

Nếu bạn thêm điều khiển, bất kỳ điều khiển nào, vào Biểu mẫu 2, nó sẽ có tên khi bạn tạo. Có vẻ như hệ thống đặt tên không cảm thấy sự cần thiết phải chỉ định một hình thức kiểm soát tên cho đến khi có nhiều điều khiển, mà nó thực hiện trong cuộc gọi InitializeComponent của nó. Bạn có thể xem mã này. Đây là đoạn mã được tạo ra cho "Form3" không có điều khiển:

private void InitializeComponent() 
{ 
    this.components = new System.ComponentModel.Container(); 
    this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 
    this.Text = "Form3"; 
} 

Và đây là hình thức tương tự sau một nhãn đã được thêm vào:

private void InitializeComponent() 
{ 
    this.label1 = new System.Windows.Forms.Label(); 
    this.SuspendLayout(); 
    // 
    // label1 
    // 
    this.label1.AutoSize = true; 
    this.label1.Location = new System.Drawing.Point(13, 13); 
    this.label1.Name = "label1"; 
    this.label1.Size = new System.Drawing.Size(35, 13); 
    this.label1.TabIndex = 0; 
    this.label1.Text = "label1"; 
    // 
    // Form3 
    // 
    this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 
    this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 
    this.ClientSize = new System.Drawing.Size(284, 262); 
    this.Controls.Add(this.label1); 
    this.Name = "Form3"; 
    this.Text = "Form3"; 
    this.ResumeLayout(false); 
    this.PerformLayout(); 

} 

Như bạn có thể thấy, một tên được chỉ định vào biểu mẫu nếu có các điều khiển khác. Đối với lý do tại sao đây là trường hợp, bạn có lẽ sẽ phải yêu cầu người đã viết mã tạo tự động cho câu trả lời đó.

Các vấn đề liên quan