2015-12-24 1 views
0

Привет я пытаюсь сделать панель, которая будет отображаться текст, когда он парил над картиной, и я хочу, чтобы следовать за курсором, так что яКак сделать мою панель остановить мерцающий

System.Windows.Forms.Panel pan = new System.Windows.Forms.Panel(); 
    public Form1() 
    { 
     InitializeComponent(); 
     Product p = new Product(); 
     p.SetValues(); 
     this.pictureBox1.Image = (Image)Properties.Resources.ResourceManager.GetObject("pictureName"); 

    } 

    private void pictureBox1_MouseEnter(object sender, EventArgs e) 
    { 
     pan.Height = 200; 
     pan.Width = 100; 
     pan.BackColor = Color.Blue; 
     this.Controls.Add(pan); 
     pan.BringToFront(); 
     //pan.Location = PointToClient(Cursor.Position); 
    } 

    private void pictureBox1_MouseLeave(object sender, EventArgs e) 
    { 
     Controls.Remove(pan); 
    } 

    private void pictureBox1_MouseMove(object sender, MouseEventArgs e) 
    { 
     pan.Location = PointToClient(Cursor.Position); 
    } 

Я попытался добавить this.doublebuffered = true; , но это только делает его выглядеть есть после того, как изображение панели, когда я двигаю мышь

, когда я наведите курсор мыши на моей картинке он показывает панель, но она мерцает, как сумасшедший это нормально или есть исправление для этого или это проблема с моими компьютерами

+0

Я предполагаю, что панели перерисовываются каждый раз, когда вы перемещаете мышь. Возможно, используйте событие 'MouseHover' (без' MouseMove') и установите [MousHoverTime] (https://msdn.microsoft.com/en-us/library/system.windows.forms.systeminformation.mousehovertime (v = vs .110) .aspx), чтобы убедиться, что это работает. – Chrono

+0

Возможный дубликат [как прекратить мерцание C# winforms] (http://stackoverflow.com/questions/8046560/how-to-stop-flickering-c-sharp-winforms) – LokiSinclair

+0

О, извините, я изменяю действие от зависания до входа Я просто использовал код – Annonymous177

ответ

2

Добавление this.DoubleDuffered = true; к Form влияет только на Form, а не на Panel.

Так используйте DoubleBuffered Panelподкласса:

class DrawPanel : Panel 
{ 
    public DrawPanel() 
    { 
     this.DoubleBuffered = true; 
    } 
} 

Однако перемещение больших вещей вокруг займут свои. Btw, PictureBox класс уже doubleBuffered. Также представляется логичным добавить панель в PictureBox, а не в форму: pictureBox1.Controls.Add(pan); И добавление pictureBox1.Refresh(); к MouseMove.

Обновление: Поскольку вы не нарисовываете на панели, а также должны перекрывать PictureBox, эти идеи на самом деле не применяются; использование подкласса не требуется, хотя в какой-то момент это может пригодиться. И да, панель должна быть добавлена ​​в коллекцию элементов управления Form!

Этот код прекрасно работает здесь:

public Form1() 
{ 
    InitializeComponent(); 

    // your other init code here 

    Controls.Add(pan); // add only once 
    pan.BringToFront(); 
    pan.Hide();   // and hide or show 
    this.DoubleDuffered = true // !! 
} 

private void pictureBox1_MouseLeave(object sender, EventArgs e) 
{ 
    pan.Hide();   // hide or show 
} 

private void pictureBox1_MouseMove(object sender, MouseEventArgs e) 
{ 
    pan.Location = pictureBox1.PointToClient(Cursor.Position); 
    pictureBox1.Refresh(); // !! 
    Refresh();    // !! 
} 

private void pictureBox1_MouseEnter(object sender, EventArgs e) 
{ 
    pan.Height = 200; 
    pan.Width = 100; 
    pan.BackColor = Color.Blue; 
    pan.Location = pictureBox1.PointToClient(Cursor.Position); 
    pan.Show();  // and hide or show 
} 

Похоже, вы пропали без вести правильную комбинацию doublebuffering в Form и освежающий как, в Form и PictureBox.

+0

Нет, панель все еще мерцает при перемещении мыши, хотя это происходит меньше – Annonymous177

+0

На самом деле я пробовал свой код, как есть, и вижу __no__ мерцание. Насколько велико изображение? – TaW

+0

ширина 209 высота 319 – Annonymous177