Delphi 2009 之 TEdit 加强的功能

1、终于添加了 Alignment 属性(taLeftJustify, taRightJustify, taCenter), 可以方便控制文本对齐了;

2、增加了 NumbersOnly 属性(True, False), 控制是否只接受数字;

3、增加了 TextHint 属性, 可以让 TEdit 携带一个辅助文本串(好像是在无焦点时显示的, 但现在有问题).

因为 D2009 中一些控件的 TextHint 属性没有效果, 经跟踪源码发现该属性是通过 API
函数 SendMessage 发送 EM_SETCUEBANNER 消息来实现的. 该消息为 WinXP 中新增消息.
据资料, 要使该消息成功发送的要求是:

1. OS 必须是 WinXP 及更高版本;
2. OS 的主题必须激活.

实现的办法类似下面的函数:

function SetCueBanner(CTRL : THandle; STR : WideString) : Integer;
// The EM_SETCUEBANNER message sets the textual cue, or tip, that is
// displayed by the edit control to prompt the user for information
// Minimum operating systems: Windows XP
const
ECM_FIRST = $1500;
EM_SETCUEBANNER = ECM_FIRST + 1;
begin
Result := SendMessage(CTRL,EM_SETCUEBANNER,0,LParam(PWideChar(STR)));
end;

但是, 在 D2007/D2009 中测试(没有在 D7 中测试), 无论是上面提到的 TextHint 属性
还是 SetCueBanner 函数, 都没有任何效果. 查阅大量资料, 无果. 于是有了下面的代码.

实现原理(要点):
1. 利用 TCanvas 类画出 TEdit 失去焦点且 Text 属性为空时的 TextExHint 属性
(TextHint 属性的加强, 可以设置字体);
2. 从 TEdit 继承, 新增两个属性: TextExHint 和 TextExHintFont, 以及相应的私有变
量: FTextExHint 和 FTextExHintFont. 其中: FTextExHint 设置提示信息,
FTextExHintFont 设置提示信息的字体;
3. 覆盖 Create, Destroy 和 WM_PAINT 方法.

Dggdsm 于 2008.09.03
完整代码如下:

}
unit TextExHintEdit;

interface

uses
SysUtils, Classes, Messages, Controls, StdCtrls, Graphics;

type
TTextExHintEdit = class(TEdit)
private
FTextExHint: string;
FTextExHintFont: TFont;
{ Private declarations }
protected
{ Protected declarations }
FCanvas : TCanvas;
procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
public
{ Public declarations }
constructor Create(AOwner : TComponent); override;
destructor Destroy; override;
published
{ Published declarations }
property TextExHint: string read FTextExHint write FTextExHint;
property TextExHintFont: TFont read FTextExHintFont write FTextExHintFont;
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('DggCtls', [TTextExHintEdit]);
end;

{ TTextExHintEdit }

constructor TTextExHintEdit.Create(AOwner: TComponent);
begin
inherited;
FCanvas := TControlCanvas.Create;
FTextExHintFont := TFont.Create;
FTextExHintFont.Color := clGrayText;
FTextExHintFont.Style := [fsItalic];
TControlCanvas(FCanvas).Control := Self;
end;

destructor TTextExHintEdit.Destroy;
begin
FreeAndNil(FTextExHintFont);
FreeAndNil(FCanvas);
inherited;
end;

procedure TTextExHintEdit.WMPaint(var Message: TWMPaint);
begin
inherited;
if (not Focused) and (Text = '') then
begin
FCanvas.Font := FTextExHintFont;
FCanvas.TextOut(1, 1, FTextExHint);
end;
end;

end.

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值