我遇到了一个重绘错误,这不是很令人愉快的看到(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()
…