我正在尝试在TEdit
控件没有焦点时实现自己的绘图(在编辑器没有完全显示其文本时在TEdit
中显示省略号)。因此,我从以下代码开始:
type
TEdit = class(StdCtrls.TEdit)
private
FEllipsis: Boolean;
FCanvas: TCanvas;
procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
end;
constructor TEdit.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FEllipsis := False;
FCanvas := TControlCanvas.Create;
TControlCanvas(FCanvas).Control := Self;
end;
destructor TEdit.Destroy;
begin
FCanvas.Free;
inherited;
end;
procedure TEdit.WMPaint(var Message: TWMPaint);
begin
if FEllipsis and (not Focused) then
begin
// Message.Result := 0;
// TODO...
end
else
inherited;
end;
请注意,当
FEllipsis和(非聚焦)
时,消息处理程序不会执行任何操作。现在我在表单上添加了一个
TButton
和2个TEdit
控件,并添加了表单OnCreate
事件:procedure TForm1.FormCreate(Sender: TObject);
begin
Edit2.FEllipsis := True;
end;
我原本希望Edit1
正常绘制,而且Edit2
不在编辑控件内绘制任何东西。
相反,消息处理程序无休止地被处理,Edit1
也没有被绘制,整个应用程序都处于崩溃状态(CPU使用率达到25%!)。 我还尝试返回Message.Result := 0
- 效果相同。
现在,关于“奇怪”的部分:当我使用BeginPaint
获取画布句柄时,一切都按预期工作。
procedure TEdit.WMPaint(var Message: TWMPaint);
var
PS: TPaintStruct;
begin
if FEllipsis and (not Focused) then
begin
if Message.DC = 0 then
FCanvas.Handle := BeginPaint(Handle, PS)
else
FCanvas.Handle := Message.DC;
try
// paint on FCanvas...
finally
FCanvas.Handle := 0;
if Message.DC = 0 then EndPaint(Handle, PS);
end;
end
else
inherited;
end;
注意,我也没有调用inherited
。
如何解释这种行为?谢谢。