ComboBox Cue Banner не курсив, когда DropDownStyle имеет значение DropDown - PullRequest
4 голосов
/ 18 января 2012

У нас есть элемент управления WinForms, представляющий собой расширенную версию ComboBox, которая поддерживает «баннеры-метки» (также известные как водяные знаки), когда нет выделения или текста. Наш элемент управления похож на эту реализацию, использующую CB_SETCUEBANNER .

Однако, когда мы устанавливаем DropDownStyle для элемента управления на ComboBoxStyle.DropDown (то есть также допускает свободный ввод текста), показывается баннер метки, но не курсивом (как обычно это выглядит).

Кто-нибудь знает, как нарисовать баннер метки курсивом для поля со списком в режиме ComboBoxStyle.DropDown ???

Ответы [ 2 ]

7 голосов
/ 18 января 2012

По замыслу.Когда Style = DropDown, текстовая часть комбинированного списка является TextBox.Который отображает баннер реплики в не курсивном стиле.Вы можете проверить с помощью этот код .В противном случае важно сделать различие между баннером и фактическим выделением видимым, когда Style = DropDownList, без сомнения причина, по которой они выбрали отображение курсива.TextBox делает это по-другому, он скрывает баннер, когда получает фокус.

Бросок в неиссякающей версии:

using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;

class CueComboBox : ComboBox {
    private string mCue;
    public string Cue {
        get { return mCue; }
        set {
            mCue = value;
            updateCue();
        }
    }
    private void updateCue() {
        if (this.IsHandleCreated && mCue != null) {
            SendMessage(this.Handle, 0x1703, (IntPtr)0, mCue);
        }
    }
    protected override void OnHandleCreated(EventArgs e) {
        base.OnHandleCreated(e);
        updateCue();
    }
    // P/Invoke
    [DllImport("user32.dll", CharSet = CharSet.Unicode)]
    private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, string lp);
}
0 голосов
/ 27 марта 2017

Упрощенная версия для C # WinForms:

using System;
using System.Runtime.InteropServices; //Reference for Cue Banner
using System.Windows.Forms;

namespace Your_Project
{
    public partial class Form1 : Form
    {
        private const int TB_SETCUEBANNER = 0x1501; //Textbox Integer
        private const int CB_SETCUEBANNER = 0x1703; //Combobox Integer
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        private static extern Int32 SendMessage(IntPtr hWnd, int msg,
            int wParam, [MarshalAs(UnmanagedType.LPWStr)]string lParam); //Main Import for Cue Banner

        public Form1()
        {
            InitializeComponent();
            SendMessage(textBox1.Handle, TB_SETCUEBANNER, 0, "Type Here..."); //Cue Banner for textBox1
            SendMessage(comboBox1.Handle, CB_SETCUEBANNER, 0, "Type Here..."); //Cue Banner for comboBox1
        }
    }
}

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

Например:

public Form1()
{
    InitializeComponent();
    textBox1.Font = new Font(textBox1.Font, FontStyle.Italic); //Italic Font for textBox1
    comboBox1.Font = new Font(comboBox1.Font, FontStyle.Italic); //Italic Font for comboBox1
    SendMessage(textBox1.Handle, TB_SETCUEBANNER, 0, "Type Here..."); //Cue Banner for textBox1
    SendMessage(comboBox1.Handle, CB_SETCUEBANNER, 0, "Type Here..."); //Cue Banner for comboBox1
}

private void textBox1_TextChanged(object sender, EventArgs e)
{
    if (textBox1.Text != "")
    {
        textBox1.Font = new Font(textBox1.Font, FontStyle.Regular); //Regular Font for textBox1 when user types
    }
    else
    {
        textBox1.Font = new Font(textBox1.Font, FontStyle.Italic); //Italic Font for textBox1 when theres no text
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...