问题是speedbutton不像bitbtn,button那样有handle,它是不能得到焦点的,没有这个handle,画不出来
非也。
不需要handle,
procedure TsrButtonCtrl.InternalPaint;
var
R: TRect;
s: string;
i, x, y: integer;
B: Tbitmap;
RM: TRect;
AR: TRect;
Rgn: HRgn;
begin
s:=caption;
R:=ClientRect;
with FCanvas do
begin
if FbtState=bsVLine then
begin
For i:=0 to height-1 do
Pixels[width div 2, i]:=ColorDarker(Pixels[width div 2, i], 60);
exit;
end;
if FbtState = bsTbHeader then
begin
for i:=0 to height-1 do
if i mod 3 = 0 then
begin
Pen.Color:=ColorDarker(Pixels[width div 2, i], 100);
MoveTo(width div 2-1, i);
LineTo(Width div 2+2, i);
end;
exit;
end;
[red] if RoundConner then
begin
Rgn:=CreateRoundRectRgn(left, Top, Left+Width, Top+Height,
FRoundMargin, FRoundMargin);
selectObject(handle, Rgn);
SaveDc(handle);
end;[/red] if FMouseEnter and Enabled then
begin
if FMouseDown then
FillTubeGradientRect(Handle, clientRect, FclslEnd, FclslBegin, false)
else
FillTubeGradientRect(Handle, clientRect, FclslBegin, FclslEnd, false);
Brush.Style:=bsClear;
Pen.Color:=FclHotLine;
if not RoundConner then
Rectangle(clientRect)
else
RoundRect(0, 0, width-1, height-1, FRoundMargin, FRoundMargin);
end
else if not FTransparent then
begin
FillTubeGradientRect(Handle, clientRect, FclBeign, FclEnd, false);
Brush.Style:=bsClear;
Pen.Color:=FclHotLine;
if not RoundConner then
Rectangle(clientRect)
else
RoundRect(0, 0, width-1, height-1, FRoundMargin, FRoundMargin);
end;
if (Fimages<>nil) and (FimageIndex<>-1) then
begin
Y:=(Height-Fimages.Height) div 2;
X:=FleftMargin;
R.Left:=R.Left+Fimages.Width + X + 3;
if FMouseDown then
begin
Fimages.Draw(FCanvas, x+1,y+1, Fimageindex);
offsetRect(R, 1, 1);
end
else
begin
Ar:=Rect(x, y, x+18, y+18);
if enabled then Fimages.Draw(FCanvas, x, y, Fimageindex)
else DrawDisabledImage(FCanvas, AR, FImages, FImageIndex, false);
end
end
else
begin
R.Left:=R.Left+FLeftmargin;
if FMouseDown then offsetRect(R, 1, 1);
end;
if FddMark then
begin
Rm:=Rect(R.Right-18, R.Top, R.Right, R.Bottom);
DrawDownArraw(FCanvas, Rm, 3, FclDDmark);
end;
Brush.Style:=bsClear;
Font:=Screen.MenuFont;
if not Enabled then Font.Color:=getAlphaColor(clEnd, clBlack, 48);
drawText(Handle, pchar(s), length(s), R, DT_VCENTER or DT_SINGLELINE);
RestoreDc(handle, -1);
end;