Отображение подсказки для элемента управления редактирования C # winforms - PullRequest
9 голосов
/ 06 сентября 2008

Я работаю над приложением winforms на C # (VS.NET 2008, .NET 3.5 sp 1). У меня есть поле поиска в форме, и вместо метки рядом с полем поиска я хотел бы показать серый текст на фоне самого поля поиска (например, «Условия поиска»). Когда пользователь начинает вводить текст в поле поиска, текст должен исчезнуть. Как мне этого добиться?

Ответы [ 5 ]

9 голосов
/ 06 сентября 2008

Для этого вам понадобится код взаимодействия P / Inovke. Найдите функцию Win32 API SendMessage и сообщение EM_SETCUEBANNER.

4 голосов
/ 15 августа 2012

Лучше размещать код, а не ссылку. Я отправляю это от здесь

            //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();
                }
            }
2 голосов
/ 06 сентября 2008

Я думаю, что обычно это делается для того, чтобы установить цвет текста на серый и предварительно заполнить его текстом подсказки.

Затем напишите обработчики для событий фокуса текстового поля, изменяя содержимое и цвет полей в зависимости от того, когда фокус получен и потерян. Вот некоторый псевдокод (извините, это совсем не код 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;
  }
}

Помните, что вы хотите изменить текст только при потере фокуса, если пользователь не изменил текст вручную. Используйте отдельное логическое значение, чтобы отслеживать, показывает ли вы подсказку или нет, чтобы вы могли различать пользователя, вручную вводящего текст «подсказки» в качестве фактического содержимого. Точно так же вы хотите очистить содержимое поля ввода, только если отображается подсказка, чтобы случайно не избавиться от пользовательского ввода.

1 голос
/ 06 сентября 2008

Дайте код по этой ссылке. Он расширяет функциональность winforms, так как это невозможно достичь прямо из коробки. Исходный код также доступен. Имейте в виду, это работает только на Win XP или выше.

http://www.aaronlerch.com/blog/2007/12/01/watermarked-edit-controls/

0 голосов
/ 06 сентября 2008

В элементе управления текстового поля есть встроенная функциональность - AutoCompleteMode и AutoCompleteSource . Возможно, стоит попробовать, прежде чем переходить к пользовательским или сторонним элементам управления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...