如何以编程方式在面板上显示图片框?

时间:2014-04-22 09:37:51

标签: c# winforms

我有以下问题,因为我很新,我不知道我是否在问正确的问题......希望有人能把我放在正确的方向,提前谢谢。

我有一个小组。里面有一个文本框(与面板大小相同(140 * 40)和一个pictureBox(较小,在右上角,15 * 15)。当我MouseHover面板时(我能够)和文本框一起显示带有删除图像的pictureBox。但如果我将鼠标放在图片框上,它就会消失,我希望只有当我MouseLeave文本框或面板时才会发生这种情况。

一所大学告诉我,我必须使用父母属性,但我不知道我该怎么做。

我不知道我的解释是否有用,但我在这里留下了一些代码,所以你可以指出我的解决方案。

TextboxtbRolePanelpnRolePictureBoxpbDeleteX

tbRole.MouseMove += (senderL, eL) =>
        {
            if (mouseHover)
            {
                pbDeleteX.Visible = true;
                mouseHover = true;
            }
            else
            {
                pbDeleteX.Visible = true;
                mouseHover = false;
            }      
            tbRole.BackColor = Color.AliceBlue;
            pnRole.BackColor = Color.AliceBlue;
            // Je dois mettre ici le DoDragDrop parce que sinon sa ne marche pas le doubleclick
            if (eL.Button == MouseButtons.Left)
            {
                idRoleG = idRoleL;
                tbRole.BringToFront();
                clRol = tbRole.BackColor;
                mouseDown = true;
                tbRole.AllowDrop = true;

                tbRole.DoDragDrop(tbRole, DragDropEffects.Move);
            }

        };            
        tbRole.MouseHover += (senderL, eL) =>
        {
            if (mouseHover)
            {
                pbDeleteX.Visible = true;
                mouseHover = false;
            }
            else
            {
                pbDeleteX.Visible = false;
                mouseHover = false;
            }
            tbRole.BackColor = pnRole.BackColor = Color.AliceBlue;
        };            
        tbRole.MouseLeave += (senderL, eL) =>
        {
            pnRole.BackColor = Color.Bisque;
            tbRole.BackColor = Color.Bisque;
            if (mouseHover)
            {
                pbDeleteX.Visible = true;
                mouseHover = false;
            }
            else
            {
                pbDeleteX.Visible = false;
                mouseHover = true;

            }

        }; 

2 个答案:

答案 0 :(得分:1)

我认为这是因为当您将鼠标光标悬停在pictureBox上时,tbRole.MouseLeave被触发。您可以使用断点检查它,看看它是否真的发生。您可以做的是编写2个布尔变量。例如,您可以说:

tbRole.MouseLeave += (senderL, eL) =>
     {
        boolText == false;

        if(boolText == false && boolPic == false) {
            pnRole.BackColor = Color.Bisque;
            tbRole.BackColor = Color.Bisque;
            pbDeleteX.Visible = false;
        }
     };

这就是:

  1. 将光标悬停在textBox上。 boolText == trueboolPic == false
  2. 将光标悬停在图片上。 boolText == falseboolPic == true。 MouseLeave没有被解雇
  3. 离开picbox。 boolText == trueboolPic == false
  4. 保留textBox。 boolText == falseboolText == false。 MouseLeave最终触发,picBox消失。
  5. 因此,您必须添加pictureBox的MouseHover和MouseLeave的代码,并且如果触发MouseHover则表示全局变量boolPic == true,并且在触发MouseLeave时表示boolPic == false。在文本框的MouseHover和MouseLeave中添加相同的逻辑。然后我希望它应该工作。 :P

答案 1 :(得分:1)

谁是父母,表格或小组无关紧要,所以你可以简单地告诉我们:textbox(tb)和picturebox(pb)。

接下来,你必须知道,每个控件实际上是一个窗口(带句柄的资源)。当您将鼠标移动到任何窗口时,对于任何上一个窗口(如果有),MouseEnter事件发生后,您将立即获得此MouseLeave事件

这称为WinAPI,风暴遵循其规则。

现在,您需要关注:

  • 当鼠标进入tb时,显示pb;
  • 当鼠标离开tb时,隐藏pb(除非它的pb)。

我不知道您为什么使用MouseHover(指定用于显示工具提示)或MouseMove(用于许多内容,但通常使用鼠标捕获或利用MouseLeave清理。

我不知道最好的方法,但你可以:

1)使用鼠标捕获。

MouseEnter上捕获鼠标,显示pb。在MouseMove检查时,当你离开tb界限时,如果你是 - 释放鼠标,隐藏pb。

因为你的pb在tb界限内,所以它将按原样运行。

2)延迟pb隐藏。

MouseEnter显示pb。在MouseLeave启动计时器上。在计时器打勾(0.5秒后?)停止计时器并隐藏pb。 PB还必须有MouseEnterMouseLeave。在pb MouseEnter中,你停止计时器。在pb MouseLeave你隐藏了pb。