Вот что вышло:
Код | Unit Mb; interface
uses Windows,SysUtils, Classes, Controls, StdCtrls, Messages, Graphics,Forms;
Type Tmb=class ( TButton ) private hd: HDC; FCanvas: TCanvas; R: TRect; public procedure WMPaint(var Message: TWMPaint); message WM_PAINT; procedure mmoud(var Message: TWMPaint); message WM_LBUTTONDOWN; procedure mmouu(var Message: TWMPaint); message WM_LBUTTONUP; procedure dclk(var Message: TWMPaint); message WM_LBUTTONDBLCLK; end; { Tmb } Type AArray=Array[0..2,0..20] of TColor; const Col: AArray=((15591399,15722985,15854571,15986157,16117743, 16117743,16117743,16117743,15920364,15722985, 15525606,15328227,15130848,14933469,14736090, 14538711,14341332,14143953,13946574,13749195, 13551816), (14736090,15065055,15394020,15657192,15920364, 16117743,16315122,16512501,16644087,16709880, 16775673,16709880,16644087,16512501,16315122, 16117743,15920364,15657192,15394020,15065055, 14736090), (8946306,9143685,9341064,9538443,9735822, 9933201,10130580,10327959,10525338,10722717, 10920096,11117475,11314854,11512233,11512233, 11512233,11512233,11380647,11249061,11117475, 10985889));
implementation
uses Unit1;
procedure Tmb.dclk(var Message: TWMPaint); var Y,C: Integer; begin inherited; C:=0; for Y:=R.Top+1 to R.Bottom-2 do begin FCanvas := TCanvas.Create; FCanvas.Lock; FCanvas.Handle:=hd; FCanvas.Pen.Color:=Col[0,C]; FCanvas.MoveTo(R.Left+1,Y); FCanvas.LineTo(R.Right-1,Y); Inc(C); end; FCanvas.Pen.Color:=$00CFCFCF; FCanvas.Brush.Style:=bsClear; FCanvas.RoundRect(R.Left,R.Top,R.Right,R.Bottom,5,5); FCanvas.TextOut(R.Left+18,R.Top+5,'Button1'); end;
procedure Tmb.mmoud(var Message: TWMPaint); var Y,C: Integer; begin inherited; C:=0; for Y:=R.Top+1 to R.Bottom-2 do begin FCanvas := TCanvas.Create; FCanvas.Lock; FCanvas.Handle:=hd; FCanvas.Pen.Color:=Col[2,C]; FCanvas.MoveTo(R.Left+1,Y); FCanvas.LineTo(R.Right-1,Y); Inc(C); end; FCanvas.Pen.Color:=$00CFCFCF; FCanvas.Brush.Style:=bsClear; FCanvas.RoundRect(R.Left,R.Top,R.Right,R.Bottom,5,5); FCanvas.TextOut(R.Left+18,R.Top+5,'Button1');
end;
procedure Tmb.mmouu(var Message: TWMPaint); var Y,C: Integer; begin inherited; C:=0; for Y:=R.Top+1 to R.Bottom-2 do begin FCanvas := TCanvas.Create; FCanvas.Lock; FCanvas.Handle:=hd; FCanvas.Pen.Color:=Col[0,C]; FCanvas.MoveTo(R.Left+1,Y); FCanvas.LineTo(R.Right-1,Y); Inc(C); end; FCanvas.Pen.Color:=$00CFCFCF; FCanvas.Brush.Style:=bsClear; FCanvas.RoundRect(R.Left,R.Top,R.Right,R.Bottom,5,5); FCanvas.TextOut(R.Left+18,R.Top+5,'Button1'); end;
procedure Tmb.WMPaint(var Message: TWMPaint); var h: HWND; Y,C: Integer;
begin inherited; C:=0; R.Top:=0; R.Bottom:=23; R.Left:=0; R.Right:=73; hd:=GetDeviceContext(h); for Y:=R.Top+1 to R.Bottom-2 do begin FCanvas := TCanvas.Create; FCanvas.Lock; FCanvas.Handle:=hd; FCanvas.Pen.Color:=Col[0,C]; FCanvas.MoveTo(R.Left+1,Y); FCanvas.LineTo(R.Right-1,Y); Inc(C); end; FCanvas.Pen.Color:=$00CFCFCF; FCanvas.Brush.Style:=bsClear; FCanvas.RoundRect(R.Left,R.Top,R.Right,R.Bottom,5,5); FCanvas.TextOut(R.Left+18,R.Top+5,'Button1'); end; end.
|
Только есть некоторые минусы. При наведении мышкой на кнопку рисунок исчезает наверное надо обрабатывать ещё одно сообщение, также видны уголки прямоугольно кнопки может можно её вообще стереть и ещё когда первый раз нажимаешь на кнопку то маска не перерисовывается а последующие нажатия перерисовывает ещё когда быстро нажимаешь то тоже не успевает от рисовать. |