2009-10-04 11 views
1

Я хочу щелкнуть внутри квадрата, а затем появится «X», но я не уверен, что помещать внутри событий Form1_MouseDown, Form1_Paint и Form1_MouseUp. Как я могу реализовать это C#?Как обработать событие мыши

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace VTest 
{ 
    public partial class Form1 : Form 
    { 
     Rectangle rect; // single rect 
     int sqsize, n; 
     int margin; 

     public Form1() 
     { 
      n = 3; 
      margin = 25; 
      sqsize = 50; 
      rect = new Rectangle(10, 10, 150, 150); 
      InitializeComponent(); 
     } 

     private void Form1_MouseDown(object sender, MouseEventArgs e) 
     { 
      // what goes here? 
     } 

     private void Form1_Paint(object sender, PaintEventArgs e) 
     { 
      // what goes here? 
     } 

     private void Form1_MouseUp(object sender, MouseEventArgs e) 
     { 
      // what goes here? 
     } 

     // ... 

ответ

0

Вам не нужен обработчик событий mousedown и mouseup.

Выберите, на что реагировать, вместо этого я вместо этого реагирую на событие MouseDown.

Но, когда вы захотите посмотреть свойства MouseEventArgs, вы сможете определить, находитесь ли вы внутри квадрата.

Вы, вероятно, хотите позвонить:

System.Diagnostics.Debug.WriteLine(...) 

с использованием свойств х и у в MouseEventArgs, так что вы можете увидеть, где щелчки мышью, и определить, когда вы находитесь в квадрате.

После того, как вы есть, то вы можете сделать X.

Вы можете написать функцию, чтобы нарисовать X и протестировать его, имея это нарисовать X на 300,300, так что вы можете убедиться, что он выглядит вы хотите, пока вы экспериментируете с MouseDown.

6

В вашем случае MouseDown, определение того, щелчок произошел в пределах вашего прямоугольника легко:

if (rect.Contains(e.Location)) 
{ 
    // the user has clicked inside your rectangle 
} 

Обращая «X» на форме также легко:

Graphics g = this.CreateGraphics(); 
g.DrawString("X", this.Font, SystemBrushes.WindowText, 
    (float)e.X, (float)e.Y); 

Однако, «X» в этом случае не будет постоянным, что означает, что если вы перетащите другую форму поверх своей формы, а затем переместите ее, «X» больше не будет. Для того, чтобы сделать постоянный «X», создать переменную точки на уровне формы, как это:

private Point? _Xlocation = null; 

Используйте событие MouseDown, чтобы установить эту переменную, если пользователь щелкает в вашем прямоугольнике:

if (rect.Contains(e.Location)) 
{ 
    _Xlocation = e.Location; 
    this.Invalidate(); // this will fire the Paint event 
} 

Тогда, в случае краски вашей формы, рисовать «X»:

if (_Xlocation != null) 
{ 
    e.Graphics.DrawString("X", this.Font, SystemBrushes.WindowText, 
     (float)e.X, (float)e.Y); 
} 
else 
{ 
    e.Graphics.Clear(this.BackColor); 
} 

Если вы хотите, «X», чтобы затем исчезнуть, когда пользователь отпускает кнопку мыши, просто поместите этот код в событие MouseUp:

_Xlocation = null; 
this.Invalidate(); 

Вы можете сделать это намного сложнее, чем хотите. С помощью этого кода «X» будет рисоваться чуть ниже и справа от места, где вы нажимаете на форму. Если вы хотите, чтобы «X» был с центром в месте щелчка, вы можете использовать метод MeasureString объекта Graphics, чтобы определить, насколько высока и насколько велика «X», и соответственно смещать местоположение DrawString.

0

Обновление: Мне нравится метод Rectangle.contains (location), продемонстрированный MusiGenesis.

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Text; 
using System.Windows.Forms; 

namespace DemoWindowApp 
{ 
    public partial class frmDemo : Form 
    { 
     Rectangle rec; 
     public frmDemo() 
     { 
      InitializeComponent(); 
     } 

     private void frmDemo_Load(object sender, EventArgs e) 
     { 
      rec = new Rectangle(150,100,100,100); 
     } 

     private void frmDemo_Paint(object sender, PaintEventArgs e) 
     { 
      Pen p = new Pen(Color.Blue); 
      Graphics g = e.Graphics; 

      g.DrawRectangle(p,rec); 
     } 

     private void frmDemo_MouseMove(object sender, MouseEventArgs e) 
     { 
      if(rec.Contains(e.Location)) 
      { 
       Cursor = Cursors.Cross; 
      }else 
      { 
       Cursor = Cursors.Default; 
      } 
     } 

     private void frmDemo_MouseDown(object sender, MouseEventArgs e) 
     { 
      if(rec.Contains(e.Location)) 
      { 
       //mouse position adjust for window postion and border size. 
       //you may have to adjust the borders depending your 
       //windows theme 
       int x = MousePosition.X - this.Left - 4; 
       int y = MousePosition.Y - this.Top - 29; 

       Graphics g = this.CreateGraphics(); 
       Pen p = new Pen(Color.Black); 
       Point p1 = new Point(x-10,y-10); 
       Point p2 = new Point(x+10,y+10); 
       Point p3 = new Point(x-10,y+10); 
       Point p4 = new Point(x+10,y-10); 

       g.DrawLines(p,new Point[]{p1,p2}); 
       g.DrawLines(p,new Point[]{p3,p4}); 
      } 
     } 
    } 
} 
Смежные вопросы