EM_SETCUEBANNER在RichTextBox上不起作用

本文关键字:不起作用 RichTextBox SETCUEBANNER EM | 更新日期: 2023-09-27 17:49:18

我一直在使用EM_SETCUEBANNER来实现我的TextBox上的占位符,它工作得很好,直到我在RichTextBox上使用它。它不显示任何文本。

下面是我的代码:

 [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError=true)]
 public static extern Int32 SendMessage(IntPtr hWnd, int msg, int wParam, [MarshalAs(UnmanagedType.LPWStr)]string lParam);
    bool SetPlaceHolder(TextBoxBase control, string text)
            {
               const int EM_SETCUEBANNER = 0x1501;
                return Natives.SendMessage(control.Handle, EM_SETCUEBANNER, 0, text) == 1;
            }

在RTB上使用它返回false,但Marshal.GetLastWin32Error()的值为0

我在Edit Control Messages上找不到任何特定的RTB。

我该如何解决这个问题?

EM_SETCUEBANNER在RichTextBox上不起作用

您可以尝试自己实现:

public class RichTextWithBanner : RichTextBox {
  private const int WM_PAINT = 0xF;
  protected override void OnTextChanged(EventArgs e) {
    base.OnTextChanged(e);
    this.Invalidate();
  }
  protected override void WndProc(ref Message m) {
    base.WndProc(ref m);
    if (m.Msg == WM_PAINT && this.Text == string.Empty) {
      using (Graphics g = Graphics.FromHwnd(m.HWnd)) {
        TextRenderer.DrawText(g, "Type Something", this.Font,
            this.ClientRectangle, Color.DarkGray, Color.Empty,
            TextFormatFlags.HorizontalCenter | TextFormatFlags.VerticalCenter);
      }
    }
  }
}

这应该不会让您感到太惊讶,除了文档之外,多行文本框也不支持提示。

没有什么是你不能解决的,这不是很难做到的。向项目添加一个新类,并粘贴如下所示的代码。编译。将新控件从工具箱顶部拖放到窗体上,替换现有控件。
using System;
using System.Drawing;
using System.Windows.Forms;
class RichTextBoxEx : RichTextBox {
    public string Cue {
        get { return cue; }
        set {
            showCue(false);
            cue = value;
            if (this.Focused) showCue(true);
        }
    }
    private string cue;
    protected override void OnEnter(EventArgs e) {
        showCue(false);
        base.OnEnter(e);
    }
    protected override void OnLeave(EventArgs e) {
        showCue(true);
        base.OnLeave(e);
    }
    protected override void OnVisibleChanged(EventArgs e) {
        if (!this.Focused) showCue(true);
        base.OnVisibleChanged(e);
    }
    private void showCue(bool visible) {
        if (this.DesignMode) visible = false;
        if (visible) {                          
            if (this.Text.Length == 0) {
                this.Text = cue;
                this.SelectAll();
                this.SelectionColor = Color.FromArgb(87, 87, 87);
            }
        }
        else {
            if (this.Text == cue) {
                this.Text = "";
                this.SelectionColor = this.ForeColor;
            }
        }
    }
}

你不能在RichTextBox本身修复它,因为你不能在多行编辑或富文本控件上设置提示横幅。

来自EM_CUEBANNER的文档(强调添加):

的评论

用于开始搜索的编辑控件可能会显示"在这里输入搜索";以灰色文本作为文本提示。当用户点击文本时,文本将消失,用户可以输入。

不能在多行编辑控件或富编辑控件上设置提示横幅。

GetLastWin32Error()返回false,因为没有错误。RichTextBox已经通知您,它不处理消息(因为SendMessage()返回false),但这不是一个错误-它只是不处理消息。SendMessage返回发送消息的结果;该结果的含义取决于正在发送的消息,在这种情况下,它意味着RichTextBox不支持它收到的消息。