unit Test; interface uses windows, messages, UtilFunc; type TSpeedBtn = class(TObject) private FParent: HWND; FColor: COLORREF; FRect: TRect; public constructor Create(hParent: HWND); procedure DefaultHandler(var Message); override; property Rect: TRect read FRect write FRect; end; implementation constructor TSpeedBtn.Create(hParent: HWND); begin FParent := hParent; FColor := clrBlue; end; procedure TSpeedBtn.DefaultHandler(var Message); var Msg: TMessage; hBr: HBRUSH; DC: HDC; p: TPoint; begin Msg := TMessage(Message); case Msg.Msg of WM_PAINT:begin hBr := CreateSolidBrush(FColor); DC := GetDC(FParent); FillRect(DC,FRect,hBr); DeleteObject(hBr); SetBkMode(DC,TRANSPARENT); SetTextColor(DC,clrWhite); DrawText(DC,'SpeedBtn',8,FRect,DT_CENTER or DT_SINGLELINE or DT_VCENTER); ReleaseDC(FParent,DC); end; WM_LBUTTONDOWN:begin p.x := Msg.LParamLo; p.y := Msg.LParamHi; if PtInRect(FRect,p) then begin if FColor = clrBlue then FColor := clrRed else FColor := clrBlue; InvalidateRect(FParent,@FRect,true); end; end; end; // case end; end.