Winforms 在GroupBox中显示禁用控件的工具提示

Winforms 在GroupBox中显示禁用控件的工具提示,winforms,c++-cli,Winforms,C++ Cli,我使用下面的代码在一个已禁用的复选框上显示工具提示,该复选框位于一个GroupBox中。 但是,仅当我首先在GroupBox外部单击,然后将鼠标箭头拖动到复选框上时,当我将鼠标移到复选框上时,工具提示才会显示 这就像GroupBox覆盖了对话框的主面板,并且没有触发事件一样 但是GroupBox没有MouseMove事件,所以我想知道如何解决这个问题 delegate void SetToolTipDelegate(ToolTip^ tooltip, Control^ control, Stri

我使用下面的代码在一个已禁用的复选框上显示工具提示,该复选框位于一个GroupBox中。 但是,仅当我首先在GroupBox外部单击,然后将鼠标箭头拖动到复选框上时,当我将鼠标移到复选框上时,工具提示才会显示

这就像GroupBox覆盖了对话框的主面板,并且没有触发事件一样

但是GroupBox没有MouseMove事件,所以我想知道如何解决这个问题

delegate void SetToolTipDelegate(ToolTip^ tooltip, Control^ control, String^ text);
void SetToolTip(ToolTip^ tooltip, Control^ control, String^ text)
{
    if (control->InvokeRequired)
    {
        SetToolTipDelegate^ d = gcnew SetToolTipDelegate(this, &MyForm::SetToolTip);
        this->Invoke(d, gcnew cli::array<Object^> { tooltip, control, text });
    }
    else
    {
        tooltip->SetToolTip(control, text);
    }
}

bool isShown;

System::Void MyForm_MouseMove(System::Object^  sender, System::Windows::Forms::MouseEventArgs^  e) {
    System::Drawing::Point p = this->checkBox1->Location;
    System::Drawing::Point g = this->groupBox1->Location;
    System::Drawing::Rectangle r = this->checkBox1->ClientRectangle;
    if ((e->X >= (p.X + g.X)) && (e->X <= (p.X + g.X + r.Width)) && (e->Y >= (p.Y + g.Y)) && (e->Y <= (p.Y + g.Y + r.Height)))
    {
        if (!isShown) {
            SetToolTip(this->toolTip1, this->checkBox1, "Here my tooltip text...");
            this->toolTip1->Show("Here my tooltip text...", this->checkBox1, r.Width / 2, r.Height / 2);
            isShown = TRUE;
        }
    }
    else
    {
        this->toolTip1->Hide(this->checkBox1);
        isShown = FALSE;
    }
}
delegate void SetToolTipDelegate(工具提示^ToolTip,控件^Control,字符串^text);
void SetToolTip(工具提示^ToolTip,控件^Control,字符串^text)
{
如果(控制->调用需要)
{
SetToolTipDelegate ^d=gcnew SetToolTipDelegate(this,&MyForm::SetToolTip);
这->调用(d,gcnewcli::array{tooltip,control,text});
}
其他的
{
工具提示->设置工具提示(控件,文本);
}
}
布尔·伊肖恩;
系统::Void MyForm_MouseMove(系统::对象^sender,系统::Windows::窗体::MouseEventArgs ^e){
系统::图纸::点p=此->复选框1->位置;
系统::图纸::点g=此->groupBox1->位置;
系统::绘图::矩形r=this->checkBox1->ClientRectangle;
如果((e->X>=(p.X+g.X))&&(e->X Y>=(p.Y+g.Y))&&&(e->Y工具提示1,此->复选框1,“这里是我的工具提示文本…”);
此->工具提示1->显示(“这里是我的工具提示文本…”,此->复选框1,右宽度/2,右高度/2);
isShown=真;
}
}
其他的
{
此->工具提示1->隐藏(此->复选框1);
isShown=假;
}
}
添加此项(对表单和GroupBox使用相同的回调)实现了以下目的:

this->groupBox1->MouseMove += gcnew System::Windows::Forms::MouseEventHandler(this, &MyForm::MyForm_MouseMove);

MouseMove事件是在具有焦点的控件上激发的。该控件永远不会是窗体,而是窗体的子控件。否则,原因是“在groupbox之外单击”这似乎是一个解决办法。一个可行的解决办法是假设用户对无法使用的控件的工作方式不感兴趣。只要FlatStyle属性不是“System”,您仍然可以使用GroupBox.MouseMove事件“@HansPassant谢谢你的建议,刚刚为其他寻找这个的人添加了答案。”。