当DropDownStyle为DropDown时,组合框提示横幅不倾斜

本文关键字:提示 倾斜 组合 DropDownStyle DropDown | 更新日期: 2023-09-27 18:20:49

我们有一个WinForms控件,它是ComboBox的扩展版本,在没有选择或文本时支持"提示横幅"(也称为水印)。我们的控制类似于使用CB_SETCUEBANNER的此实现。

然而,当我们将控件的DropDownStyle设置为ComboBoxStyle.DropDown(也就是说,还允许自由文本输入)时,提示横幅正在显示,只是不是以斜体显示(这是它通常显示的方式)。

有人知道如何在ComboBoxStyle.DropDown模式下为组合框绘制斜体提示横幅吗???

当DropDownStyle为DropDown时,组合框提示横幅不倾斜

按设计。当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);
}

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
    }
}