第一种方法:
unit CenterEdit;
interface
uses
Windows,
Classes,
Controls,
SysUtils,
Messages,
StdCtrls,
Forms,
Graphics;
type
TCenterEdit=class(TEdit)
private
FFontHeight:Integer;
procedure CalcFontHeight;
protected
procedure CMFontChanged(var Message: TMessage); message CM_FONTCHANGED;
procedure WMNCCalcSize(var Message:TWMNCCalcSize);message WM_NCCALCSIZE;
public
constructor Create(AOwner:TComponent);override;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('SkinEngine',[TCenterEdit]);
end;
procedure SetWindowFrameChange(AWindowHandle:HWND);
begin
SetWindowPos(
AWindowHandle,
0,
0,
0,
0,
0,
SWP_FRAMECHANGED or SWP_NOMOVE or SWP_NOSIZE);
end;
{ TCenterEdit }
procedure TCenterEdit.CalcFontHeight;
var
DC:HDC;
Bitmap:TBitmap;
begin
Bitmap:=TBitmap.Create;
try
Bitmap.Canvas.Font.Assign(Font);
Self.FFontHeight:=Bitmap.Canvas.TextHeight('高度');
finally
Bitmap.Free;
end;
end;
procedure TCenterEdit.CMFontChanged(var Message: TMessage);
begin
inherited;
CalcFontHeight;
SetWindowFrameChange(Handle);
end;
constructor TCenterEdit.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
CalcFontHeight;
end;
procedure TCenterEdit.WMNCCalcSize(var Message: TWMNCCalcSize);
var
NCCalcSizeParams: PNCCalcSizeParams;
begin
Inherited;
if (BorderStyle<>bsNone) then
begin
NCCalcSizeParams:=Message.CalcSize_Params;
Inc(NCCalcSizeParams.rgrc0.Top,(Height-FFontHeight) div 2 - 4);
Dec(NCCalcSizeParams.rgrc0.Bottom,(Height-FFontHeight) div 2 - 4);
end;
end;
end.
第二种方法:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TEdit = class(StdCtrls.TEdit)
protected
procedure CreateParams(var Params: TCreateParams); override;
procedure KeyPress(var Key: Char); override;
procedure WMSize(var msg: TWMSize);message WM_SIZE;
procedure SetParent(AParent: TWinControl);override;
procedure SetCenter;
end;
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
procedure FormCreate(Sender: TObject);
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
public
{ Public declarations }
Edt: TEdit;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if Key = #13 then
ShowMessage('asdf');
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Edt := TEdit.Create(self);
Edt.Parent := self;
Edt.AutoSize := False;
Edt.Height := 50;
end;
{ TEdit }
procedure TEdit.CreateParams(var Params: TCreateParams);
begin
inherited;
Params.Style := Params.Style or ES_MULTILINE;
end;
procedure TEdit.KeyPress(var Key: Char);
begin
inherited;
if Key = #13 then
key := #0;
end;
procedure TEdit.SetCenter;
var
DC: HDC;
SaveFont: HFont;
Sin: Integer;
SysMetrics, Metrics: TTextMetric;
Rct: TRect;
begin
DC := GetDC(0);
GetTextMetrics(DC, SysMetrics);
SaveFont := SelectObject(DC, Font.Handle);
GetTextMetrics(DC, Metrics);
SelectObject(DC, SaveFont);
ReleaseDC(0, DC);
if Ctl3D then Sin := 8 else Sin := 6;
Rct := ClientRect;
Sin := Height - Metrics.tmHeight - Sin;
Rct.Top := Sin div 2;
SendMessage(Handle, EM_SETRECT, 0, Integer(@Rct));
end;
procedure TEdit.SetParent(AParent: TWinControl);
begin
inherited;
if Parent <> nil then
begin
SetCenter;
end;
end;
procedure TEdit.WMSize(var msg: TWMSize);
begin
inherited;
SetCenter;
end;
end.