Winapi 如何使用';占位符文本';在win32编辑控件中?

Winapi 如何使用';占位符文本';在win32编辑控件中?,winapi,controls,edit,Winapi,Controls,Edit,看看堆栈溢出站点的右上角。搜索框中有一些文字,上面写着“搜索”。在其中单击时,文本将消失 我想做类似的事情-如果win32编辑控件为空(即没有文本),我想在其中绘制一些文本,颜色比普通文本更柔和。如果控件有焦点,或者控件中有文本,我不想绘制它 有没有什么方法可以在不将实际文本设置到控件中并更改文本颜色的情况下执行此操作?也许是堵住控制油漆什么的 谢谢。也许吧,但是为什么不根据需要设置默认文本和颜色,并使用“onClick”事件清除它呢?一种可能性:让它成为所有者绘制,如果.text属性为空,则手

看看堆栈溢出站点的右上角。搜索框中有一些文字,上面写着“搜索”。在其中单击时,文本将消失

我想做类似的事情-如果win32编辑控件为空(即没有文本),我想在其中绘制一些文本,颜色比普通文本更柔和。如果控件有焦点,或者控件中有文本,我不想绘制它

有没有什么方法可以在不将实际文本设置到控件中并更改文本颜色的情况下执行此操作?也许是堵住控制油漆什么的


谢谢。

也许吧,但是为什么不根据需要设置默认文本和颜色,并使用“onClick”事件清除它呢?

一种可能性:让它成为所有者绘制,如果.text属性为空,则手动在其上绘制文本。

看看从XP开始就可以了。检查消息。然而,有一些原因使它不能完全在XP上正常工作,所以最好是在处理Vista


如果您需要Win2k或更旧版本,您需要自己完成,至少在这些平台上是这样。

谢谢您提出这个问题,我将来可以使用它。 FWIW(可能不多),下面是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;

您不需要所有者绘制,它是带有用户API(横幅)的本机
请参阅示例(在C中)

,因为在有人输入之前,我不想检索文本并获取默认文本。这意味着我必须添加各种各样的默认文本检查,等等,这将是一件痛苦的事情。请注意,它是作为一个名为TextHint的属性内置到VCL中的-我认为它是在D2009中添加的,尽管我现在还不能完全确定。