gpt4 book ai didi

delphi - TEdit 和 WM_PAINT 消息处理程序的奇怪行为

转载 作者:行者123 更新时间:2023-12-03 14:46:35 28 4
gpt4 key购买 nike

我试图在 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 获取 Canvas 句柄时,一切都会按预期进行。

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

如何解释这种行为?谢谢。

最佳答案

当窗口无效时,系统会要求它在下一个绘制周期使其自身有效。通常,当 GetMessage 发现队列为空时,会在主线程消息循环中发生这种情况。此时,WM_PAINT 消息被合成并分派(dispatch)到窗口。

当窗口收到这些消息时,它的任务就是绘制自己。这通常是通过调用 BeginPaint 然后调用 EndPaint 来完成的。对 BeginPaint 的调用验证窗口的客户端矩形。这是您所缺乏的关键信息。

现在,在您的代码中,您没有调用 inherited,因此没有绘制任何内容,也没有调用 BeginPaint/EndPaint。由于您没有调用 BeginPaint,因此窗口仍然无效。因此会生成无穷无尽的 WM_PAINT 消息。

相关文档可参见here :

The BeginPaint function automatically validates the entire client area.

关于delphi - TEdit 和 WM_PAINT 消息处理程序的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47035092/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com