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++:
我也有兴趣了解兔子洞有多深,所以, 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; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |