我有一个图片框(f.e.picturebox1),默认情况下不可见。当我点击一个按钮(让我们说按钮1)时,picturebox1将会显示出来。现在 - >当我点击它(在表格本身或任何其他控件上)时,我需要再次隐藏picturebox1。它与上下文菜单的工作方式相同。
我不知道怎么做,因为任何" Click_Outside"事件不存在。有没有简单的方法来做到这一点?感谢。
答案 0 :(得分:1)
这是一个简单的解决方案,虽然不是一个完全容易完全理解的解决方案,因为它涉及捕获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外部的每次单击都会隐藏它。
答案 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重复这个循环,并根据你拥有的控件用文本框,按钮,组合框,标签......替换这些点