代码之家  ›  专栏  ›  技术社区  ›  Andrew

显示C#winforms编辑控件的提示

  •  9
  • Andrew  · 技术社区  · 16 年前

    我正在开发一个C#winforms应用程序(VS.NET2008、.NET3.5SP1)。我在表单上有一个搜索字段,而不是在搜索字段旁边有一个标签,我想在搜索字段本身的背景中显示一些灰色文本(“搜索词”),例如。当用户开始在搜索字段中输入文本时,文本应消失。我怎样才能做到这一点?

    5 回复  |  直到 16 年前
        1
  •  9
  •   Ajay    10 年前

    您需要使用一些P/Inovke互操作代码来实现这一点。寻找Win32 API SendMessage 功能与功能 EM_SETCUEBANNER

        2
  •  4
  •   Esen    12 年前

    最好是发布代码而不是链接。我是从 here

                //Copyright (c) 2008 Jason Kemp
    
                //Permission is hereby granted, free of charge, to any person obtaining a copy
                //of this software and associated documentation files (the "Software"), to deal
                //in the Software without restriction, including without limitation the rights
                //to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
                //copies of the Software, and to permit persons to whom the Software is
                //furnished to do so, subject to the following conditions:
    
                //The above copyright notice and this permission notice shall be included in
                //all copies or substantial portions of the Software.
    
                //THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
                //IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
                //FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
                //AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
                //LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
                //OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
                //THE SOFTWARE.
    
                using System;
                using System.Runtime.InteropServices;
                using System.Windows.Forms;
                using System.Text;
    
    
                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();
                    }
                }
    
        3
  •  2
  •   Herms    16 年前

    我认为通常的做法是将文本的颜色设置为灰色,并用提示文本进行预填充。

    然后,为文本字段的焦点事件编写处理程序,根据焦点的获得和丢失修改字段内容和颜色。这里有一些伪代码(对不起,它完全不是C代码。我现在脑子里有Actionscript):

    TextInput myInput;
    boolean showingHint = true;
    
    myInput.text = "Search Terms";
    myInput.color = 0xcccccc;
    
    myInput.onFocusGained = function() {
      if(showingHint) {
        myInput.text = "";
        myInput.color = 0x000000;
        showingHint = false;
      }
    }
    
    myInput.onFocusLost = function() {
      if(!showingHint && myInput.text.length == 0) {
        myInput.text = "Search Terms";
        myInput.color = 0xcccccc;
        showingHint = true;
      }
    }
    

    请记住,如果用户没有手动更改文本,您只想更改焦点丢失时的文本。使用单独的布尔值跟踪是否显示提示,以便区分用户手动键入“提示”文本作为实际内容。类似地,您只希望在显示提示时清除输入框的内容,这样您就不会意外地删除用户输入。

        4
  •  0
  •   Guy Starbuck    16 年前