2010-10-04 30 views
6

Hiện tại, tập hợp con của tôi trên biểu mẫu sẽ cung cấp cho tôi các dây x, y trong một nhãn. Nhãn này mặc dù khi tôi nhấp vào nó, tôi không nhận được mousedown. Nhưng khi tôi đặt mã vào mousedown cho nhãn, nó cung cấp cho các dây dựa trên nguồn gốc của nhãn và không phải là toàn bộ hình thức.Làm cách nào để có được vị trí X, Y của chuột liên quan đến biểu mẫu ngay cả khi nhấp vào một điều khiển khác?

Mục tiêu của tôi là có thể phát hiện x, y ở mọi nơi trong biểu mẫu. Ngay cả khi nó là trên một nhãn, nút.

Xin cảm ơn trước.

+1

Vui lòng cung cấp tiêu đề mô tả cho câu hỏi của bạn. Tiêu đề như "C# Winform Question", v.v., không cung cấp bất kỳ ý nghĩa nào. –

Trả lời

4

Có vẻ một chút của một hack nhưng ...

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 

     foreach (Control c in this.Controls) 
     { 
      c.MouseDown += ShowMouseDown;  
     } 

     this.MouseDown += (s, e) => { this.label1.Text = e.X + " " + e.Y; }; 

    } 

    private void ShowMouseDown(object sender, MouseEventArgs e) 
    { 
     var x = e.X + ((Control)sender).Left; 
     var y = e.Y + ((Control)sender).Top; 

     this.label1.Text = x + " " + y; 
    } 
} 
+0

Vì vậy, điều này về cơ bản đi qua mỗi điều khiển, như hộp kiểm, nhãn và bất cứ điều gì và sau đó c.MouseDOwn + = ShowMouseDown; đang sử dụng phương thức ShowMouseDown và đặt nó vào C.MouseDown. Tôi không hoàn toàn hiểu những gì dòng htis đang làm, this.MouseDown + = (s, e) => {this.label1.Text = e.X + "" + e.Y; }; – RoR

+0

Tôi mới đến C#, tôi xin lỗi. Ngoài ra người gửi đối tượng là gì? Đây có phải là tên của kiểm soát không? Người gửi (Kiểm soát) là gì? Cảm ơn bạn đã dành thời gian. – RoR

3
protected override void OnMouseMove(MouseEventArgs mouseEv) 
{ 
    txtBoxX.Text = mouseEv.X.ToString(); 
    txtBoxY.Text = mouseEv.Y.ToString(); 
} 
+0

Đây là dành cho onmousemove. Tôi yêu cầu nhấp vào nút chuột, để chụp tại đó rất x, y cordinate. Nhưng cũng có thể nhấp vào bên trong nhãn và nhận x, y của biểu mẫu tổng thể. – RoR

2

Bạn có thể điều chỉnh theo this.Location.
hoặc sử dụng this.PointToClient(Cursor.Position) trên biểu mẫu và mỗi điều khiển.

+0

không hoàn toàn chắc chắn những gì bạn có nghĩa là điều chỉnh this.Location. Tôi đã thử sử dụng Vị trí e.Location.X.ToString() nhưng cung cấp cho tôi câu trả lời chính xác giống như e.X.ToString(). Vị trí là gì? – RoR

+0

Xin lỗi vì câu trả lời không rõ ràng của tôi. Tôi muốn có nghĩa là Vị trí kiểm soát (bạn có thể sử dụng Left, Top). Từ sự kiện di chuột xuống của điều khiển, bạn có thể sử dụng: this.Location.X + e.X để có được tương đối so với biểu mẫu. Trong cách thứ hai, bạn có thể sử dụng this.PointToClient (Cursor.Position) trên Form chuột xuống, và mỗi cho mỗi điều khiển bạn có, bạn có thể sử dụng một vòng lặp để đính kèm xử lý sự kiện như JP Alioto đề xuất. – pinichi

3

Bạn có thể có được vị trí như this.PointToClient này (Cursor.Position) vào mẫu cho mỗi điều khiển.

2

Tôi nhận ra điều này đã được một thời gian trước, nhưng tôi đã tìm ra nó có thể giúp ai đó. Tôi nghĩ cách để giải quyết vấn đề này là đệ quy:

public partial class Form1 : Form 
{ 

public Form1() 
{ 
    InitializeComponent(); 
    label1.MouseDown += MyMouseDown; 
} 

void MyMouseDown(object sender, MouseEventArgs e) 
{ 
    if (e.Button == MouseButtons.Left)//If it's left button that's the trigger 
    { 
     Control c = (Control)sender; 
     if (c.Parent == null) return;//Has no more children, wrong condition? 
     if(c.Parent != this)//We've reached top level 
     { 
      MyMouseDown(c.Parent, new MouseEventArgs(e.Button, 
       e.Clicks, 
       c.Parent.Location.X + e.X, 
       c.Parent.Location.Y + e.Y, 
       e.Delta)); 
      return; 
     } 
     //Do what shall be done here... 
    } 
} 
} 
Các vấn đề liên quan