禁用控件 工具提示在 Windows 窗体的“组”框中不起作用
本文关键字:不起作用 窗体 控件 工具提示 Windows | 更新日期: 2023-09-27 18:34:43
我正在尝试显示禁用控件的工具提示..我可以在表单鼠标移动事件中做到这一点,即使它工作正常
http://stackoverflow.com/questions/491267/how-can-i-show-a-tooltip-on-a-disabled-button
但是当我为组框中的控件执行此操作时,它不起作用..
需要帮助
我正在使用的代码..
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
var parent = sender as Control;
if (parent == null)
{
return;
}
var ctrl = parent.GetChildAtPoint(e.Location);
if (ctrl != null && !ctrl.Enabled)
{
if (ctrl.Visible && toolTip1.Tag == null)
{
var tipstring = "My tooltip";// toolTip1.GetToolTip(ctrl);
toolTip1.Show(tipstring, ctrl, ctrl.Width / 2, ctrl.Height / 2);
toolTip1.Tag = ctrl;
}
}
else
{
ctrl = toolTip1.Tag as Control;
if (ctrl != null)
{
toolTip1.Hide(ctrl);
toolTip1.Tag = null;
}
}
}
当我将控件放置在组框外时,它起作用,但是当我将控件放置在组框内时,它不起作用
我刚刚调试了代码,并得到Form1_MouseMove事件不适用于 Groupbox 内的控件。基本上 var ctrl = parent。GetChildAtPoint(e.Location(;它采用分组框的位置,而不是组框内控件的位置
希望可以使用groupBox1_MouseHover来做到这一点...有没有人使用它来获取组框的控件。
你需要一些global MouseMove
,尝试使用这样的IMessageFilter
;
public partial class Form1 : Form, IMessageFilter {
public Form1(){
InitializeComponent();
Application.AddMessageFilter(this);
}
public bool PreFilterMessage(ref Message m){
if(m.Msg == 0x200){//WM_MOUSEMOVE = 0x200
ShowToolTip(Control.FromHandle(m.HWnd));
}
return false;
}
private void ShowToolTip(Control ctrl){
if (ctrl != null && !ctrl.Enabled)
{
if (ctrl.Visible && toolTip1.Tag == null)
{
var tipstring = "My tooltip";// toolTip1.GetToolTip(ctrl);
toolTip1.Show(tipstring, ctrl, ctrl.Width / 2, ctrl.Height / 2);
toolTip1.Tag = ctrl;
}
}
else
{
ctrl = toolTip1.Tag as Control;
if (ctrl != null)
{
toolTip1.Hide(ctrl);
toolTip1.Tag = null;
}
}
}
}
注意:我想您的原始代码工作正常。虽然我觉得不好。
GroupBox 吞噬了父窗体上的 MouseMove,因此 @King King 的全局 MouseMove 处理程序应该可以工作,但有点极端,因为有一个更简单的解决方案。
即使设计器不在分组框上提供 MouseMove 事件,它仍然存在。
只需添加加载或显示的事件(构造函数也应该有效(
groupBox.MouseMove += GroupBox_MouseMove;
您还可以获取最初设置的工具提示文本(例如在设计器中(并设置:
string toolTipString = toolTip.GetToolTip(control);
如果需要它同时适用于父窗体和分组框,则可以将同一事件处理程序添加到多个控件。