C# 禁用的控件工具提示在Windows窗体的组框内不起作用?
我正在尝试显示禁用控件的工具提示。我可以在窗体鼠标移动事件中执行它,即使它工作正常C# 禁用的控件工具提示在Windows窗体的组框内不起作用?,c#,asp.net,.net,windows,winforms,C#,Asp.net,.net,Windows,Winforms,我正在尝试显示禁用控件的工具提示。我可以在窗体鼠标移动事件中执行它,即使它工作正常 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
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中的控件不起作用;它采用的是groupbox的位置,而不是控件在group box中的位置 希望可以使用groupBox1_鼠标覆盖来实现这一点……让任何人都可以使用它来获取group box的控件。如果需要一些全局鼠标移动,请尝试使用类似这样的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处理程序应该可以工作,但有一个更简单的解决方案,这有点极端 即使设计师没有在groupbox上提供MouseMove事件,它仍然存在 只需添加load或Showed事件构造函数就可以了
groupBox.MouseMove += GroupBox_MouseMove;
您还可以获取工具提示文本集。G在designer中,并设置:
string toolTipString = toolTip.GetToolTip(control);
如果您需要它同时适用于父窗体和groupbox,您可以向多个控件添加相同的事件处理程序。我刚刚调试了代码,得到Form1\u MouseMove事件不适用于groupbox内的控件。基本上,var ctrl=parent.GetChildAtPointe.Location;它获取的是组框的位置,而不是组框内控件的位置。谢谢您的代码,但是您在哪里使用了PreFilterMessage…如何用它标记control@RahulChowdhuryPreFilterMessage不是为手动调用而设计的,它是由底层类自动调用的。你试过我的代码了吗?@RahulChowdhury我错过了表单构造函数中的一行代码,请参阅更新。我们需要AddMessageFilter。谢谢你的回复…但它不起作用..我在一个组框中使用了两个按钮。在表单加载中,我放置了按钮。Enable=false..然后我执行你在这里执行的操作..我已调试它…它没有进入if ctrl!=空&!ctrl.Enabled条件..那么m.Msg==0x200有什么用?