2015-12-09 13 views
5

Tôi đang làm việc trên chương trình trò chơi WordSearch (còn được gọi là WordFind), nơi bạn phải tìm một số từ nhất định trong một khối chữ cái. Tôi đang sử dụng C# WinForms.MouseHover không kích hoạt khi chuột rơi xuống

Vấn đề của tôi là khi tôi muốn bấm và giữ 1 chữ cái (Label), sau đó kéo qua các chữ cái khác để thay đổi ForeColor của chúng. Tôi đã thử googling nhưng vô ích.

Dưới đây là những gì tôi có:

foreach (Letter a in game.GetLetters()) 
{ 
    this.Controls.Add(a); 
    a.MouseDown += (s, e2) => 
    { 
     isDown = true; 
     a.ForeColor = Color.Yellow; 
    }; 
    a.MouseUp += (s, e2) => 
    { 
     isDown = false; 
    }; 
    a.MouseHover += (s, e2) => 
    { 
     if (isDown) 
      a.ForeColor = Color.Yellow; 
    }; 
} 

Tuy nhiên, sự kiện MouseHover không bao giờ cháy trừ chuột không được tổ chức xuống. Ngoài ra không có may mắn trao đổi MouseHover với MouseEnter. Vì vậy, tôi giữ MouseDownMouseUp sự kiện và cố gắng sử dụng MouseHover trong chính biểu mẫu:

private void frmMain_MouseHover(object sender, MouseEventArgs e) 
{ 
    if (isDown) 
    { 
     foreach (Letter l in game.GetLetters()) 
      if (l.ClientRectangle.Contains(l.PointToClient(Control.MousePosition))) 
       l.ForeColor = Color.Purple; 
    } 
} 

Sự kiện này không cháy hoặc và tôi đang ở một mất mát như lý do tại sao nó không bắn và những gì một số giải pháp thay thế là . Mọi lời khuyên đều được đánh giá cao.

+1

Bạn có thể sử dụng bộ đếm thời gian và kiểm tra xem nút chuột có phải sau đó mã từ 'frmMain_MouseHover' sẽ được thực hiện hay không. Bạn có thể kiểm tra [answer] này (http://stackoverflow.com/questions/8159534/net-how-to-check-if-the-mouse-is-in-a-control) –

+0

Giải pháp tuyệt vời! Thinkin bên ngoài hộp! Tysm! –

Trả lời

3

Bạn có thể sử dụng các sự kiện Kéo và thả.

  1. Đặt AllowDrop thuộc tính cho mỗi điều khiển nhắm mục tiêu thả.
  2. Xử lý sự kiện MouseDown cho mỗi điều khiển mà kéo bắt đầu với nó và trong trình xử lý cuộc gọi DoDragDrop sự kiện của điều khiển đó và đặt dữ liệu bạn muốn kéo.
  3. Xử lý DragEnetr sự kiện của từng mục tiêu kéo và đặt e.Effect để xác định xem có được phép thả hay không. Đây là nơi mà bạn có thể kiểm tra nếu thả được phép, thay đổi màu sắc trở lại màu sắc mong muốn của bạn.
  4. Xử lý DragLeave để đặt lại màu sau.
  5. Hanlde DragDrop và sử dụng phương pháp GetData nếu e.Data để nhận dữ liệu và thực hiện tác vụ khi thả.

đi bộ qua

Ví dụ

Tôi có 3 nút, button1 và button2 và button3 và button2 là mục tiêu của thả. Trong đoạn mã dưới đây, tôi sẽ kiểm tra xem văn bản sẽ thả trên nút 2, là văn bản của button1, tôi sẽ đổi màu sau của nút 2 thành xanh lục, sang màu đỏ khác. cũng nếu bạn kéo chuột ra khỏi nút2, tôi sẽ đặt màu sau thành mặc định.Nếu bạn thả, tôi sẽ thay đổi văn bản của button2 và sẽ thiết lập văn bản của button1:

//Start drag for button 2 
private void button1_MouseDown(object sender, MouseEventArgs e) 
{ 
    this.button1.DoDragDrop(this.button1.Text, DragDropEffects.Copy); 
} 

//Start drag for button 3 
private void button3_MouseDown(object sender, MouseEventArgs e) 
{ 
    this.button3.DoDragDrop(this.button3.Text, DragDropEffects.Copy); 
} 

//Check if drop is allowed and change back color 
private void button2_DragEnter(object sender, DragEventArgs e) 
{ 
    if(e.Data.GetData(DataFormats.Text).ToString()== button1.Text) 
    { 
     e.Effect = DragDropEffects.Copy; 
     this.button2.BackColor = Color.Green; 
    } 
    else 
    { 
     e.Effect = DragDropEffects.None; 
     this.button2.BackColor = Color.Red; 
    } 
} 

//Perform drop actions 
private void button2_DragDrop(object sender, DragEventArgs e) 
{ 
    this.button2.Text = e.Data.GetData(DataFormats.Text).ToString(); 
} 

//Reset back color here 
private void button2_DragLeave(object sender, EventArgs e) 
{ 
    this.button2.BackColor = SystemColors.Control; 
} 
+0

Tysm cho đề xuất này, sẽ chơi xung quanh với những sự kiện này và xem liệu điều này có hoạt động tốt hơn không. Luôn luôn nghĩ rằng những sự kiện này chỉ dành cho việc kéo tệp vào biểu mẫu. –

+1

Bạn được chào đón :) hãy cho tôi biết nếu bạn có bất kỳ câu hỏi nào về câu trả lời hoặc nếu bạn có thể giải quyết vấn đề :) –

+0

Bingo! Làm việc kỳ diệu. Chúc mừng! –

0

Bạn đang tìm kiếm những sự kiện kéo khác nhau:

https://msdn.microsoft.com/en-us/library/system.windows.forms.control.dragenter(v=vs.110).aspx https://msdn.microsoft.com/en-us/library/system.windows.forms.control.dragover(v=vs.110).aspx

vv ...

Vấn đề mà bạn đang chạy vào đó là bạn đang sử dụng các sự kiện sai cho những gì bạn đang cố gắng hoàn thành.

+1

Chính xác thì đây không phải là câu trả lời? Anh ấy đang sử dụng các sự kiện sai. Đừng đi downvoting mọi người chỉ vì bạn không biết làm thế nào để sửa chữa vấn đề của mình. Sử dụng bộ hẹn giờ là một cách ngu ngốc và không cần thiết để giải quyết giải pháp này khi anh ấy có thể nhận được kết quả chính xác mà anh ấy đang tìm kiếm bằng cách sử dụng các sự kiện kéo thay vì nhấp. . . . –

+3

@AnthonyHart Câu trả lời của bạn về mặt kỹ thuật là chính xác +1 cho câu trả lời của bạn. Nhưng nó tốt hơn để thêm chi tiết hơn để trả lời, như tôi đã làm :) Hy vọng bạn tìm thấy câu trả lời hữu ích :) –

+1

Bạn không thể đăng một loạt các liên kết mà không có bất kỳ lời giải thích. Ít nhất, bạn nên viết rằng các sự kiện mà ông đã sử dụng không phù hợp trong tình huống này và ông cần phải sử dụng một cái gì đó khác (chỉ định các sự kiện và cách sử dụng chúng). Điều quan trọng là phải có các liên kết trong câu trả lời nhưng chúng có thể thay đổi để nó giúp bạn trích dẫn chúng trong câu trả lời của bạn. Bình luận của tôi có thể sai, đó là lý do tại sao nó là một bình luận nhưng không phải là một câu trả lời. Tôi hoàn toàn đồng ý rằng việc sử dụng bộ hẹn giờ không phải là cách tiếp cận tốt nhất. Xin vui lòng cải thiện câu trả lời của bạn và mọi người sẽ upvote nó. –

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