我遇到了一个不太令人愉快的重绘错误(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
可能一些解决方法信息会很棒。
答案 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_PAINT
和PaintMsg
中的DoExit()
,而不是声明DoEnter()
并处理Render()
消息方法。抱歉,我没有时间编译代码或尝试取消WMPaint()
并使用PostMessage()
...