C#WindowsForms - 在外部单击后隐藏控件

时间:2016-05-07 20:33:01

标签: c# .net winforms click contextmenu

C#WindowsForms - 在外部单击后隐藏控件

我有一个图片框(f.e.picturebox1),默认情况下不可见。当我点击一个按钮(让我们说按钮1)时,picturebox1将会显示出来。现在 - >当我点击它(在表格本身或任何其他控件上)时,我需要再次隐藏picturebox1。它与上下文菜单的工作方式相同。

我不知道怎么做,因为任何" Click_Outside"事件不存在。有没有简单的方法来做到这一点?感谢。

4 个答案:

答案 0 :(得分:1)

这是一个简单的解决方案,虽然不是一个完全容易完全理解的解决方案,因为它涉及捕获WndProc事件并使用Windows inderds中的一些常量..:

这是显而易见的部分:

private void button1_Click(object sender, EventArgs e)
{
    pictureBox1.Show();
}

很遗憾我们无法使用pictureBox1.LostFocus事件来隐藏Picturebox

这是因为只有一些控件在点击时实际上可以获得焦点;一个Button或其他交互式控件,如ListBoxCheckBox等也可以。

PanelPictureBox以及Form本身无法通过这种方式获得关注。所以我们需要更全面的解决方案。

与往常一样,解决方案来自Windows消息系统的深度:

const int WM_PARENTNOTIFY = 0x210;
const int WM_LBUTTONDOWN = 0x201;

protected override void WndProc(ref Message m)
{
    if (m.Msg == WM_LBUTTONDOWN || (m.Msg == WM_PARENTNOTIFY && 
        (int)m.WParam == WM_LBUTTONDOWN))
        if (!pictureBox1.ClientRectangle.Contains( 
                         pictureBox1.PointToClient(Cursor.Position))) 
            pictureBox1.Hide();
    base.WndProc(ref m);
}

请注意,我们需要确保您仍然可以查看PictureBox本身;所以我们检查鼠标是否在ClientRectangle ..

只需将其添加到表单代码中,PictureBox外部的每次单击都会隐藏它。

答案 1 :(得分:0)

使用控件的LostFocus事件(在您的情况下,PictureBox控件)

答案 2 :(得分:0)

正如您所说, ClickOutside 并不存在,因此您几乎没有选择:

遍历表单的所有控件(Form.Controls)并添加一个隐藏PictureBox的click事件,不包括" Show"按钮。

您可以截取源代码中的鼠标单击消息,如下例所示:intercept

答案 3 :(得分:0)

最简单的方法是: 将以下方法复制并粘贴到代码中的任何位置:

private void mouseClick(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left && pictureBox1.Visible == true)
            pictureBox1.Visible = false;
    }

然后在form_Load事件中复制并粘贴以下代码:

foreach (Control ctrl in this.Controls)
    if (ctrl is GroupBox || ctrl is .....)
        ctrl.MouseClick += mouseClick;

当然你应该为另一个groupBox中的每个groupBox重复这个循环,并根据你拥有的控件用文本框,按钮,组合框,标签......替换这些点