2

我遇到了一个不太好看的重绘错误(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

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

4

1 回答 1

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()是因为我需要在呈现之前调整文本内容的方式。但是你正在做的事情不需要这些代码。因此,您可以只发布from和方法,而不是声明WMPaint()和处理消息。抱歉,我没有时间编译代码或尝试消除和使用...WM_PAINTPaintMsgDoExit()DoEnter()Render()WMPaint()PostMessage()

于 2013-05-30T00:37:30.433 回答