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

时间:2013-05-29 09:31:52

标签: delphi richedit

我遇到了一个不太令人愉快的重绘错误(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.13.1230

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

1 个答案:

答案 0 :(得分:1)

我在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() ...

相关问题