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



我遇到了一个重绘错误,这不是很令人愉快的看到(Delphi 5, Windows 7 64位,经典主题)

如果你创建了一个可调整大小的对话框,里面有客户端对齐的RichEdit,并提供了

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

那么至少在Windows 7中,当调整对话框的大小时,线条不会被重新包装,而是来自字符的像素继续填充空间,看起来整个区域永远不会无效。当用鼠标激活控件时,richit开始正常工作。

我想它与Delphi中的窗体和对话框的消息队列有关,但可能是特定于特定版本的richhedits。我的

  • 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_PAINT消息,您可能只是从DoExit()DoEnter()Render()方法发布PaintMsg。对不起,我没有时间编译代码或尝试消除WMPaint()和使用PostMessage()

最新更新