C# WinForm给控件加入hint文字

今天突然来了一个这样的需求,需要在C#的编辑框上加入一个Hint水印效果,类似如下图:

C# WinForm给控件加入hint文字

以前在手机上(wp)上做过类似的效果。参考silverlight toolkit 的searchTextBox。现在要在winform下制作,开始我还以为应该有啥啥属性可以一键搞定,结果目测了一下,没有什么属性,于是乎百度了一下,网上说用win32API来做,这倒挺神奇的,参考别人做了如下列子。

申明一个Win32Utility类,静态的,

代码如下

public static class Win32Utility
{

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    private static extern Int32 SendMessage(IntPtr hWnd, int msg,
    int wParam, [MarshalAs(UnmanagedType.LPWStr)] string lParam);

    [DllImport("user32.dll")]
    private static extern bool SendMessage(IntPtr hwnd, int msg, int wParam, StringBuilder lParam);

    [DllImport("user32.dll")]
    private static extern bool GetComboBoxInfo(IntPtr hwnd, ref COMBOBOXINFO pcbi);

    [StructLayout(LayoutKind.Sequential)]
    private struct COMBOBOXINFO
    {
        public int cbSize;
        public RECT rcItem;
        public RECT rcButton;
        public IntPtr stateButton;
        public IntPtr hwndCombo;
        public IntPtr hwndItem;
        public IntPtr hwndList;
    }

    [StructLayout(LayoutKind.Sequential)]
    private struct RECT
    {
        public int left;
        public int top;
        public int right;
        public int bottom;
    }

    private const int EM_SETCUEBANNER = 0x1501;
    private const int EM_GETCUEBANNER = 0x1502;

    public static void SetCueText(Control control, string text)
    {
        if (control is ComboBox)
        {
            COMBOBOXINFO info = GetComboBoxInfo(control);
            SendMessage(info.hwndItem, EM_SETCUEBANNER, 0, text);
        }
        else
        {
            SendMessage(control.Handle, EM_SETCUEBANNER, 0, text);
        }
    }

    private static COMBOBOXINFO GetComboBoxInfo(Control control)
    {
        COMBOBOXINFO info = new COMBOBOXINFO();
        //a combobox is made up of three controls, a button, a list and textbox;
        //we want the textbox
        info.cbSize = Marshal.SizeOf(info);
        GetComboBoxInfo(control.Handle, ref info);
        return info;
    }

    public static string GetCueText(Control control)
    {
        StringBuilder builder = new StringBuilder();
        if (control is ComboBox)
        {
            COMBOBOXINFO info = new COMBOBOXINFO();
            //a combobox is made up of two controls, a list and textbox;
            //we want the textbox
            info.cbSize = Marshal.SizeOf(info);
            GetComboBoxInfo(control.Handle, ref info);
            SendMessage(info.hwndItem, EM_GETCUEBANNER, 0, builder);
        }
        else
        {
            SendMessage(control.Handle, EM_GETCUEBANNER, 0, builder);
        }
        return builder.ToString();
    }

}

然后在程序里这样调用即可。实现超简单… (本文章无源码,需要使用直接拷贝如上代码即可)

C# WinForm给控件加入hint文字

本博客所有文章如无特别注明均为原创

如果觉得对你有帮助,可以通过下方打赏对作者表示鼓励

本文采用知识共享署名-非商业性使用-相同方式共享

如若转载,请注明出处:https://www.fangsi.net/30.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2013年5月3日 08:25
下一篇 2013年5月3日 16:50

相关推荐

发表评论

登录后才能评论

评论列表(2条)

  • 风啦啦
    风啦啦 2014年2月5日 16:34

    可以给一个示例代码么?不知道在程序的哪里调用。测试了再loadform的时候调用,没有作用啊。。。win7 64位,已经加载user32.dll并写好win32utility类

    • 胖子
      锋哥 2014年2月6日 21:24

      @风啦啦调用就在load里面调用就行了,如果没有效果就换个操作系统试试,代码是完全没有问题的。