如何在win32编辑控件中使用“占位文本”?

9
请看Stack Overflow网站右上角。搜索框中有一些文本显示“搜索”。当你在框内点击时,文本会消失。
我想做类似的事情——如果win32编辑控件为空(即没有文本),我想在其中绘制一些文本,颜色比普通文本更加柔和。如果控件具有焦点或其中有文本,则不希望绘制该文本。
有没有办法在不设置实际文本并更改文本颜色的情况下完成呢?也许通过拦截控件绘制或其他方式?
谢谢。
6个回答

10

从 XP 开始就可以实现。检查 EM_SETCUEBANNER 消息。但是,在 XP 上有 某些问题,使其无法完全按照应有的方式工作,所以最好处理 Vista。

如果您需要 Win2k 或更早版本的支持,则至少在这些平台上需要自己进行操作。


3
感谢您的提问,我将来能够在这方面提供帮助。 以下是Delphi实现的示例(可能不是很有用):
procedure TForm1.FormShow(Sender: TObject);
const
  ECM_FIRST = $1500;
  EM_SETCUEBANNER = ECM_FIRST + 1;
begin
  SendMessage(edt.Handle,EM_SETCUEBANNER,0,LParam(PWideChar(WideString('Enter search here'))));
end;

1
请注意,它已经作为名为TextHint的属性内置于VCL中 - 我认为它是在D2009中添加的,虽然我现在不是完全确定。 - Michael Madsen

1
一种可能的方法是:将其设置为自绘,如果.Text属性为空,则手动将文本绘制到其中。

1

0
也许可以,但为什么不直接根据需要设置默认文本和颜色,并在“onClick”事件中清除它呢?

1
因为在有人输入之前,我不想检索文本并获取默认文本。这意味着我必须添加各种检查默认文本的代码,这会很麻烦。 - Colen

0

你不需要自绘,它是使用用户API(Banner)本地化的。 请参阅Winapi grp获取示例(使用C语言)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接