加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 我如何自定义绘制TEdit控件文本?

发布时间:2020-12-15 09:44:43 所属栏目:大数据 来源:网络整理
导读:我想使用不同于默认值的Font.Color绘制一块TEdit.Text.有没有例子怎么做? 我试图做这样的事情: 注意:这个截图图片只是一个毛茸茸的草稿,但它让我确信可解决的问题. 解决方法 编辑控件没有所有者绘制支持,但您可以通过对其进行子类化和处理WM_PAINT(以及许
我想使用不同于默认值的Font.Color绘制一块TEdit.Text.有没有例子怎么做?

我试图做这样的事情:

注意:这个截图图片只是一个毛茸茸的草稿,但它让我确信可解决的问题.

解决方法

编辑控件没有所有者绘制支持,但您可以通过对其进行子类化和处理WM_PAINT(以及许多其他消息)来自定义绘制它.这是可行的,但实际100%正确实施将是一个痛苦的世界.来自文档: Developing Custom Draw Controls in Visual C++:

Note that owner-draw will work for most controls. However,it doesn’t work for edit controls; and with regards to the list control,it works only for report-view style

我也有兴趣了解兔子洞有多深,所以,
下面是使用插入器类的代码示例(仍然需要实现选择,但是当插入符号在控件中时自定义绘图有效):

type
  TEdit = class(StdCtrls.TEdit)
  private
    FCanvas: TCanvas;
    procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
  protected
    procedure WndProc(var Message: TMessage); override;
    procedure Paint; virtual;
    procedure PaintWindow(DC: HDC); override;
    property Canvas: TCanvas read FCanvas;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  end;

...

constructor TEdit.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FCanvas := TControlCanvas.Create;
  TControlCanvas(FCanvas).Control := Self;
end;

destructor TEdit.Destroy;
begin
  FCanvas.Free;
  inherited Destroy;
end;

procedure TEdit.Paint;
var
  R: TRect;
  I: Integer;
  S: String;
begin
  R := ClientRect;
  Inc(R.Left,1);
  Inc(R.Top,1);
  Canvas.Brush.Assign(Self.Brush);
  Canvas.Font.Assign(Self.Font);
  for I := 1 to Length(Text) do
  begin
    if Text[I] in ['0'..'9'] then
      Canvas.Font.Color := clRed
    else
      Canvas.Font.Color := clGreen;
    S := Text[I];
    DrawText(Canvas.Handle,PChar(S),-1,R,DT_LEFT or DT_NOPREFIX or
      DT_WORDBREAK or DrawTextBiDiModeFlagsReadingOnly);
    Inc(R.Left,Canvas.TextWidth(S));
  end;
end;

procedure TEdit.PaintWindow(DC: HDC);
begin
  FCanvas.Lock;
  try
    FCanvas.Handle := DC;
    try
      TControlCanvas(FCanvas).UpdateTextFlags;
      Paint;
    finally
      FCanvas.Handle := 0;
    end;
  finally
    FCanvas.Unlock;
  end;
end;

procedure TEdit.WMPaint(var Message: TWMPaint);
begin
  ControlState := ControlState+[csCustomPaint];
  inherited;
  ControlState := ControlState-[csCustomPaint];
end;

procedure TEdit.WndProc(var Message: TMessage);
begin
  inherited WndProc(Message);
  with Message do
    case Msg of
      CM_MOUSEENTER,CM_MOUSELEAVE,WM_LBUTTONUP,WM_LBUTTONDOWN,WM_KEYDOWN,WM_KEYUP,WM_SETFOCUS,WM_KILLFOCUS,CM_FONTCHANGED,CM_TEXTCHANGED:
      begin
        Invalidate;
      end;
   end; 
end;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读