2015-02-12 2 views
0

У меня есть меньшее изображение в моей форме. Когда пользователь нависает над изображением, он отображает увеличенный вид изображения (который следует за мышью, но остается на некотором расстоянии от мыши). Для этого я создаю форму без формBormStyles, когда курсор наводит изображение.MouseLeave обнаружение не работает с ImageForm

Проблема, с которой я столкнулся, заключается в том, что первая форма, кажется, больше не обнаруживает, что мышь зависает или покидает PictureBox после активации формы. Форма также не следует курсору.

Вот похудела версия о том, что у меня есть:

C#

bool formOpen = false; 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     pictureBox1.MouseHover += pictureBox1_MouseHover; 
     pictureBox1.MouseLeave +=pictureBox1_MouseLeave; 
    } 

    void pictureBox1_MouseHover(object sender, EventArgs e) 
    { 
     if (formOpen == false) 
     { 
      Form form = new Form(); 
      form.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; 
      form.BackColor = Color.Orchid; 
      //Show the form 
      form.Show(); 
      form.Name = "imageForm"; 
      this.AddOwnedForm(form); 

      //Set event handler for when the mouse leaves the image area. 
      //form.MouseLeave += form_MouseLeave; 
      //Set the location of the form and size 
      form.BackColor = Color.Black; 
      form.Dock = DockStyle.Fill; 
      form.Size = new Size(30, 30); 
      form.BackgroundImageLayout = ImageLayout.Center; 
      this.TopMost = true; 
      formOpen = true; 

      form.Location = new Point(Cursor.Position.X, Cursor.Position.Y); 
     } 
    } 


    private void pictureBox1_MouseLeave(object sender, EventArgs e) 
    { 
     //MessageBox.Show("Worked"); 
    } 
} 
+0

Когда мышь покидает PictureBox, вы сбросить 'formOpen' обратно' false'? –

+0

Да, таким образом это не постоянно открывает формы, когда вы наводите изображение. – Corey

+0

Не знаете, почему вы используете вторую форму в первом месте. но проблемы, по-видимому, исходят из самых высоких по умолчанию, крадя фокус. См. [Ответ Ганса здесь для возможного решения] (http://stackoverflow.com/questions/3729899/opening-a-winform-with-topmost-true-but-not-having-it-steal-focus) – TaW

ответ

2

MouseLeave (и другие события) не был обнаружен, поскольку открытие всплывающего окна и особенно его создание topmost=true убрало фокус с оригинальной формы и PictureBox.

Он также не двигаться, потому что не код был предоставлен движется ..

Вот несколько изменений, которые сделают вид ход:

  • Вам нужно ссылку на него в form1 уровень
  • вам нужно переместить его в MouseMove случае

Обратите внимание, что Hover является однократная тип даже т. Он запускает только один раз до тех пор, пока вы не оставите управление .. (Примечание: Setsu переключился с Hover на Enter.Это отлично работает, но не хватает короткой задержки перед отображением 2-й формы. Если вы хотите вернуть ее обратно, Hover или вы можете подделать задержка парить на Timer, что это то, что я часто делаю.)

// class level variable 
Form form; 

private void Form1_Load(object sender, EventArgs e) 
{ 
    pictureBox1.MouseEnter += pictureBox1_MouseEnter; 
    pictureBox1.MouseLeave +=pictureBox1_MouseLeave; 
    pictureBox1.MouseMove += pictureBox1_MouseMove; // here we move the form.. 
} 

// .. with a little offset. The exact numbers depend on the cursor shape 
void pictureBox1_MouseMove(object sender, MouseEventArgs e) 
{ 
    if ((form != null) && form.Visible) 
    { 
     form.Location = new Point(Cursor.Position.X + 5, Cursor.Position.Y + 5); 
    } 
} 

void pictureBox1_MouseEnter(object sender, EventArgs e) 
{ 
    // we create it only once. Could also be done at startup! 
    if (form == null) 
    { 
     form = new Form(); 
     form.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; 
     //form.BackColor = Color.Orchid; 
     form.Name = "imageForm"; 
     this.AddOwnedForm(form); 
     form.BackColor = Color.Black; 
     form.Dock = DockStyle.Fill; 
     form.Size = new Size(30, 30); 
     form.BackgroundImageLayout = ImageLayout.Center; 
     //this.TopMost = true; // wrong! this will steal the focus!! 
     form.ShowInTaskbar = false; 
    } 
    // later we only show and update it.. 
    form.Show(); 
    form.Location = new Point(Cursor.Position.X + 5, Cursor.Position.Y + 5); 
    // we want the Focus to be on the main form! 
    Focus(); 
} 

private void pictureBox1_MouseLeave(object sender, EventArgs e) 
{ 
    if (form!= null) form.Hide(); 
} 
+0

BTW новая форма должна быть размещена со смещением, а не непосредственно там, где находится мышь. Я столкнулся с этой проблемой раньше, чем 1) Мышь перемещается вправо 2) Мышь входит во вторую форму, прежде чем ее можно переместить 3) Форма больше не перемещается, потому что мышь теперь находится в дочерней форме – Setsu

+0

Я обновил свой ответ и, похоже, работает здесь , – TaW

+0

Это решение работает очень хорошо, но может иметь разрывы в зависимости от того, что OP хочет показать. Установка формы с двойной буферизацией обеспечит лучший пользовательский опыт, но потребует применения отдельного класса формы. – Setsu

0

MouseHover = Происходит, когда указатель мыши на элементе управления. (msdn)

Попробуйте MouseMove вместо этого.

+0

Я тоже попробовал MouseMove, такая же проблема возникает.То, что когда другая форма открывается, приложение не может обнаружить движение мыши или местоположение границ. – Corey

+0

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

+0

Спасибо, это помогло. – Corey

Смежные вопросы