2017-01-19 8 views
0

У меня есть программа, где я могу рисовать простые фигуры на panel, и она отслеживает движение мыши.Отображение панели Visual Studio

private void DrawingPanel_MouseMove(object sender, MouseEventArgs e) 
{ 
    toolStripStatusLabel1.Text= e.X + "," + e.Y; 
} 

Мне было интересно, есть ли способ, которым я могу «отобразить» свою панель. При отображении я имею в виду создание областей (с rectangle coords f.e.), которые будут показывать какое-то сообщение или всплывающие подсказки на моем курсоре, когда я наводил курсор на эту область.

Возможно ли это сделать?

EDIT: Чтобы быть ясным - я не использую mouseEvent для рисования фигуры на своей панели. Я рисую их с помощью кнопок, созданных в боковом меню.

EDIT2: Пример: Я нарисовал прямоугольник (10, 10, 20, 20). Когда я наводил указатель мыши на эти коорды, я хотел бы получить всплывающее окно по моему курсору. Somethinkg like:

System.Windows.Forms.ToolTip Rect = new System.Windows.Forms.ToolTip(); 
      ToolTip1.SetToolTip(this.Rect, "Reactangle 100 m2"); 
+0

Я ищу правильное понимание: вы перемещаетесь и наведите указатель мыши на панель. И вы хотите видеть, что некоторые всплывающие (метки) перемещаются вместе с мышью, показывая, например. коорды мыши, правильно? – Tatranskymedved

+0

Не совсем, так как я могу рисовать фигуры на этой панели, я буду отслеживать координаты этих фигур. И позже я хочу создать несколько всплывающих сообщений, когда я наводил указатель мыши на созданную фигуру. – mymek

+0

Чтобы ответить на ваш вопрос. Да, это возможно. Пожалуйста, сушите круг вопросов. – TyCobb

ответ

2

Если вы хотите, вы можете создать индивидуальные «видовые экраны» для вашей панели рисования.

Для этого вашему Paint событию необходимо настроить объект Graphics и затем выполнить его в этих портах.

Вот минимальный пример ..:

enter image description here

Paint событие привлекает тока мс в трех различных видовых:

private void drawPanel1_Paint(object sender, PaintEventArgs e) 
{ 
    foreach (var v in ViewPorts) 
    { 
     int i = ViewPorts.IndexOf(v); 
     e.Graphics.ResetClip(); 
     e.Graphics.ResetTransform(); 

     e.Graphics.SetClip(v); 
     e.Graphics.TranslateTransform(v.X, v.Y); 
     e.Graphics.Clear(colors[i]); 
     e.Graphics.DrawString(DateTime.Now.Millisecond + "' - " +i, 
           Font, Brushes.Black, 0,0); 
    } 
} 

Обратите внимание, как я всегда могу сделать, чтобы координировать (0,0)!

Он использует несколько переменные:

List<Rectangle> ViewPorts = new List<Rectangle>(); 
List<Color> colors = new List<Color>(); 

Вот как настроить списки и анимацию таймер:

colors.Add(Color.LightCoral); 
colors.Add(Color.LightCyan); 
colors.Add(Color.LightGreen); 
ViewPorts.Add(new Rectangle( 0, 0, 200, 250)); 
ViewPorts.Add(new Rectangle(100, 100, 100, 50)); 
ViewPorts.Add(new Rectangle(210, 200, 100, 50)); 

Timer t = new Timer(); 
t.Interval = 250; 
t.Tick += (ss, ee) => { drawPanel1.Invalidate(); }; 
t.Start(); 

Вы не будете использовать Timer но рисовать с помощью изменений видового экрана специфические данные и при звонке Invalidate по адресу Panelпри изменении данных ..

Я добавил BackColor, который, так же, как ForeColor, Fonts, а затем некоторые, должны лучше быть частью ViewPort класса; такой класс может также провести метод Draw который вы назвали бы от Paint события панели, раздавая параметр e.Graphics ..

Если вы не хотите/нужен ваш вывод сохраняется, которые также могут в случае всплывающих подсказок, вы можете skipPaint event; для этого случая я бы отключил видовое окно, имел ссылку на целевую панель в нем и использовал CreateGraphics с почти таким же кодом, как указано выше.

0

Я понял, что самый простой способ сделать «карту» панели ma - создать области в MouseMove event, и если мышь перемещается по этой области, создается метка с текстом. Например, одна область имеет координаты 100,150,200,250, и она выглядит примерно так:

public void DrawingPanel2_MouseMove(object sender, MouseEventArgs e) 

    { 
      if (e.X >= 100 && e.X <= 150 && e.Y >= 200 && e.Y <= 250) 
       { 
        toolStripStatusLabel1.Text = "Point A"; 

        Label lblA = new Label(); 
        lblA.Text = "Point A"; 
        lblA.Location = new System.Drawing.Point(e.X, e.Y); 

        lblA.AutoSize = true; 
        DrawingPanel2.Controls.Add(lblA); 
       } 

       else 
       { 
        toolStripStatusLabel1.Text = e.X + "," + e.Y; 
        DrawingPanel2.Controls.Clear(); 
       } 
     }