繁体   English   中英

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

[英]C# WindowsForms - Hide control after clicking outside of it

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

我有一个默认情况下不可见的图片框 (fe picturebox1)。 当我单击一个按钮(假设为 button1)时,picturebox1 将出现。 现在 -> 当我在它的外部(在表单本身或任何其他控件上)单击时,我需要使 picturebox1 再次隐藏。 它的工作原理与上下文菜单的工作原理相同。

我不知道该怎么做,因为任何“Click_Outside”事件都不存在。 有没有简单的方法可以做到这一点? 谢谢。

这是一个简单的解决方案,虽然不是一个完全容易完全理解的解决方案,因为它确实涉及捕获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 外单击都会隐藏它。

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

正如你所说, ClickOutside不存在,所以你有几个选择:

循环遍历表单 (Form.Controls) 的所有控件,并添加一个隐藏图片框(不包括“显示”按钮)的单击事件。

您可以在源处拦截鼠标单击消息,如本例所示: intercept

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

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 重复此循环,并根据您拥有的控件将点替换为文本框、按钮、组合框、标签等

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM