C# WinForm給控件加入hint文字

          今天突然來了一個這樣的需求,需要在C#的編輯框上加入一個Hint水印效果,類似如下圖:

          C# WinForm給控件加入hint文字

          以前在手機上(wp)上做過類似的效果。參考silverlight toolkit 的searchTextBox?,F在要在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文字

          本博客所有文章如無特別注明均為原創

          如果覺得對你有幫助,可以通過下方打賞對作者表示鼓勵

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

          如若轉載,請注明出處:《C# WinForm給控件加入hint文字》http://www.solariosolutions.com/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里面調用就行了,如果沒有效果就換個操作系統試試,代碼是完全沒有問題的。

          国产厨房乱子伦露脸,XXXXAAA欧美,日本 888 XXXX,国产欧美日韩一区二区图片