You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为UserControl内部TextBox同步外部设置的ToolTip?

可行解决方案

方法1:通过WndProc拦截ToolTip设置消息

WinForms中ToolTip给控件设置文本时,会发送TTM_SETTOOLINFO消息。我们可以在自定义UserControl中重写WndProc捕获这个消息,提取出ToolTip文本后同步给内部TextBox,全程无需反射或查找窗体控件。

C# 代码示例:

protected override void WndProc(ref Message m)
{
    const int TTM_SETTOOLINFO = 0x0432;

    if (m.Msg == TTM_SETTOOLINFO)
    {
        var ti = (TOOLINFO)Marshal.PtrToStructure(m.LParam, typeof(TOOLINFO));
        var toolTipText = ti.lpszText;

        if (!string.IsNullOrEmpty(toolTipText))
        {
            // 同步文本到内部TextBox,可复用外部ToolTip或直接创建
            var toolTip = new ToolTip();
            toolTip.SetToolTip(this.textBox1, toolTipText);
        }
    }

    base.WndProc(ref m);
}

[StructLayout(LayoutKind.Sequential)]
private struct TOOLINFO
{
    public uint cbSize;
    public uint uFlags;
    public IntPtr hwnd;
    public IntPtr uId;
    public RECT rect;
    public IntPtr hinst;
    [MarshalAs(UnmanagedType.LPStr)]
    public string lpszText;
    public IntPtr lParam;
    public int xTooltip;
    public int yTooltip;
}

[StructLayout(LayoutKind.Sequential)]
private struct RECT
{
    public int Left, Top, Right, Bottom;
}

VB.NET 代码示例:

Protected Overrides Sub WndProc(ByRef m As Message)
    Const TTM_SETTOOLINFO As Integer = &H432

    If m.Msg = TTM_SETTOOLINFO Then
        Dim ti As TOOLINFO = CType(Marshal.PtrToStructure(m.LParam, GetType(TOOLINFO)), TOOLINFO)
        Dim toolTipText As String = ti.lpszText

        If Not String.IsNullOrEmpty(toolTipText) Then
            Dim toolTip As New ToolTip()
            toolTip.SetToolTip(Me.TextBox1, toolTipText)
        End If
    End If

    MyBase.WndProc(m)
End Sub

<StructLayout(LayoutKind.Sequential)>
Private Structure TOOLINFO
    Public cbSize As UInteger
    Public uFlags As UInteger
    Public hwnd As IntPtr
    Public uId As IntPtr
    Public rect As RECT
    Public hinst As IntPtr
    <MarshalAs(UnmanagedType.LPStr)>
    Public lpszText As String
    Public lParam As IntPtr
    Public xTooltip As Integer
    Public yTooltip As Integer
End Structure

<StructLayout(LayoutKind.Sequential)>
Private Structure RECT
    Public Left, Top, Right, Bottom As Integer
End Structure

方法2:添加公共属性同步文本

在自定义UserControl中新增ToolTipText公共属性,外部窗体直接通过RESX绑定该属性,设置时自动同步文本到UserControl自身和内部TextBox。

C# 代码示例:

private string _toolTipText;

[Category("Appearance")]
public string ToolTipText
{
    get => _toolTipText;
    set
    {
        _toolTipText = value;
        var toolTip = new ToolTip();
        toolTip.SetToolTip(this, value);
        toolTip.SetToolTip(this.textBox1, value);
    }
}

这个方法更直观,设计阶段就能在属性面板直接配置,完全适配动态RESX绑定需求,没有非常规操作。


内容的提问来源于stack exchange,提问作者Daniel Bürckner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 01:17:18