Dmi*_*ryB 2 delphi richedit delphi-xe5
当RichEdit控件成为其他控件的父文件时,它会停止绘制文本.
这是一个功能还是一个bug?是否有可能使RichEdit成为其他控件的父级?
看看下一个应用:
- Form1.dfm ---
object Form1: TForm1
Left = 0
Top = 0
Caption = 'Form1'
ClientHeight = 282
ClientWidth = 418
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object Button1: TButton
Left = 24
Top = 8
Width = 75
Height = 25
Caption = 'Button1'
TabOrder = 0
OnClick = Button1Click
end
object RichEdit1: TRichEdit
Left = 16
Top = 72
Width = 145
Height = 105
Font.Charset = RUSSIAN_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
Lines.Strings = (
'RichEdit1')
ParentFont = False
TabOrder = 1
end
end
Run Code Online (Sandbox Code Playgroud)
- Form1.dfm ---
--- Unit1.pas ---
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ComCtrls;
type
TForm3 = class(TForm)
Button1: TButton;
RichEdit1: TRichEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form3: TForm3;
implementation
{$R *.dfm}
procedure TForm3.Button1Click(Sender: TObject);
begin
Button1.Parent := RichEdit1;
RichEdit1.Invalidate;
end;
end.
Run Code Online (Sandbox Code Playgroud)
--- Unit1.pas ---
在Delphi XE5 + Win 7下测试.
我想用这样的Edit按钮创建RichEdit

这是我想要的结果 - 使用DropDown编辑器的RichEdit:

使用处理WM_PAINT消息的内插器类,如下所示:
type
TRichEdit = class(Vcl.ComCtrls.TRichEdit)
protected
procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
end;
procedure TRichEdit.WMPaint(var Message: TWMPaint);
begin
DefaultHandler(Message);
end;
Run Code Online (Sandbox Code Playgroud)
由于迷失在时间迷雾中的原因,对于富编辑DLL的原始版本实际上只需要对其进行TCustomRichEdit一些特殊处理WM_PAINT.此外,当另一个控件成为富编辑的父级时,这种特殊处理会破坏正常绘制.因此,解决问题需要重新建立标准的VCL/Windows绘制处理,这就是上面的代码所做的.
也就是说,我怀疑在丰富的编辑中嵌入一个按钮实际上是你想要的 - 例如,文本不会环绕它.