![](/img/trans.png)
[英]windowsforms C# Control - Move and resize a control in execution time
[英]C# WindowsForms - Hide control after clicking outside of it
我有一个默认情况下不可见的图片框 (fe picturebox1)。 当我单击一个按钮(假设为 button1)时,picturebox1 将出现。 现在 -> 当我在它的外部(在表单本身或任何其他控件上)单击时,我需要使 picturebox1 再次隐藏。 它的工作原理与上下文菜单的工作原理相同。
我不知道该怎么做,因为任何“Click_Outside”事件都不存在。 有没有简单的方法可以做到这一点? 谢谢。
这是一个简单的解决方案,虽然不是一个完全容易完全理解的解决方案,因为它确实涉及捕获WndProc
事件并使用 Windows inderds 中的一些常量..:
这是显而易见的部分:
private void button1_Click(object sender, EventArgs e)
{
pictureBox1.Show();
}
不幸的是,我们不能使用pictureBox1.LostFocus
事件来隐藏Picturebox
。
那是因为只有某些控件在单击它们时才能真正获得焦点; Button
或其他交互式控件(如ListBox
、 CheckBox
等)也可以。
但是Panel
、 PictureBox
以及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.