如何为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
相关产品推荐
相关产品推荐

