gpt4 book ai didi

delphi - 如何修复对话框中的RichEdit重绘错误

转载 作者:行者123 更新时间:2023-12-03 18:42:13 26 4
gpt4 key购买 nike

我遇到了一个重绘错误,看起来不太愉快(Delphi 5,Windows 7 64位,经典主题)

如果创建带有客户端对齐的RichEdit的可调整大小的对话框并提供功能

procedure TQueryDlg.ShowDialog(const Txt: string);
begin
RichEdit.Text:=Txt;
ShowModal;
end;


那么至少在Windows 7上调整对话框大小时,行不会重新包装,而是来自字符的像素不断填充该空间,并且看起来整个区域从未失效。当用鼠标激活控件时,richedit将开始正常工作。

我想它与Delphi中的表单和对话框的消息队列有关,但可能特定于特定版本的RichEdits。我的


System32 / Richedit32.dll-v6.1.7601.17514
System32 / RichEdit20.dll-v3.1、5.31.23.1230


可能有些解决方法信息会很棒。

最佳答案

我在TRichEdit控件上遇到了类似的问题。我发现除非它是可见的,否则它不会自行绘制(在我的应用程序中并非总是如此)。而且我发现,在用户将注意力集中到它之前,它渲染不正确。两者都很烦人。

对我有用的是创建自己的类并向其中添加Render()方法。这样一来,我可以告诉它在需要时进行绘制(例如,在调整表单大小时或在组件不可见时)。

这是我所做的非常精简的版本:

interface

uses
Winapi.Messages, Vcl.ComCtrls;

type
TMyRichEdit = class(TRichEdit)
private
procedure WMPaint(var Message: TMessage); message WM_PAINT;
public
procedure DoExit; override;
procedure DoEnter; override;
procedure Render;
end;

var
PaintMsg: TMessage;

implementation

procedure TMyRichEdit.DoEnter;
begin
inherited;
WMPaint(PaintMsg);
end;

procedure TMyRichEdit.DoExit;
begin
inherited;
WMPaint(PaintMsg);
end;

procedure TMyRichEdit.Render;
begin
WMPaint(PaintMsg);
end;

procedure TMyRichEdit.WMPaint(var Message: TMessage);
begin
// eliminated custom code to tweak the text content...
inherited;
end;

initialization
PaintMsg.Msg := WM_PAINT;
PaintMsg.WParam := 0;
PaintMsg.LParam := 0;
PaintMsg.Result := 0;

end.


我添加了 WMPaint(),因为我需要在呈现文本之前调整文本内容的方式。但是您执行的操作不需要任何代码。因此,您可能只需要通过 WMPaint()WM_PAINTPaintMsg方法发布 DoExit(),而不是声明 DoEnter()和处理 Render()消息。抱歉,我没有时间编译代码或尝试消除 WMPaint()并使用 PostMessage() ...

关于delphi - 如何修复对话框中的RichEdit重绘错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16810289/

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