2012-03-29 53 views
3

我使用的是张贴在这个环节TSplitter enhanced with grab bar代码,绘制在分割控制扶手杆,定制油漆方法不使用Vcl的样式颜色

procedure TSplitter.Paint; 
var 
    R: TRect; 
    X, Y: integer; 
    DX, DY: integer; 
    i: integer; 
    Brush: TBitmap; 
begin 
    R := ClientRect; 
    Canvas.Brush.Color := Color; 
    Canvas.FillRect(ClientRect); 

    X := (R.Left+R.Right) div 2; 
    Y := (R.Top+R.Bottom) div 2; 
    if (Align in [alLeft, alRight]) then 
    begin 
    DX := 0; 
    DY := 3; 
    end else 
    begin 
    DX := 3; 
    DY := 0; 
    end; 
    dec(X, DX*2); 
    dec(Y, DY*2); 

    Brush := TBitmap.Create; 
    try 
    Brush.SetSize(2, 2); 
    Brush.Canvas.Brush.Color := clBtnHighlight; 
    Brush.Canvas.FillRect(Rect(0,0,1,1)); 
    Brush.Canvas.Pixels[0, 0] := clBtnShadow; 
    for i := 0 to 4 do 
    begin 
     Canvas.Draw(X, Y, Brush); 
     inc(X, DX); 
     inc(Y, DY); 
    end; 
    finally 
    Brush.Free; 
    end; 

end; 

代码工作得很好,但是当我启用了vcl样式,用于绘制分离器的颜色和抓取条不适合vcl样式使用的颜色。

enter image description here

我怎么可以得出使用当前主题的VCL的风格颜色TSplitter?

回答

4

使用代码(clBtnFace,clBtnHighlight,clBtnShadow)的system color constants不存储vcl样式颜色,您必须使用StyleServices.GetSystemColor函数将这些颜色转换为vcl样式颜色。

procedure TSplitter.Paint; 
var 
    R: TRect; 
    X, Y: integer; 
    DX, DY: integer; 
    i: integer; 
    Brush: TBitmap; 
begin 
    R := ClientRect; 
    if TStyleManager.IsCustomStyleActive then 
    Canvas.Brush.Color := StyleServices.GetSystemColor(clBtnFace) 
    else 
    Canvas.Brush.Color := Color; 

    Canvas.FillRect(ClientRect); 

    X := (R.Left+R.Right) div 2; 
    Y := (R.Top+R.Bottom) div 2; 
    if (Align in [alLeft, alRight]) then 
    begin 
    DX := 0; 
    DY := 3; 
    end else 
    begin 
    DX := 3; 
    DY := 0; 
    end; 
    dec(X, DX*2); 
    dec(Y, DY*2); 

    Brush := TBitmap.Create; 
    try 
    Brush.SetSize(2, 2); 

    if TStyleManager.IsCustomStyleActive then 
     Brush.Canvas.Brush.Color := StyleServices.GetSystemColor(clBtnHighlight) 
    else 
     Brush.Canvas.Brush.Color := clBtnHighlight; 

    Brush.Canvas.FillRect(Rect(0, 0, Brush.Height, Brush.Width)); 

    if TStyleManager.IsCustomStyleActive then 
     Brush.Canvas.Pixels[0, 0] := StyleServices.GetSystemColor(clBtnShadow) 
    else 
     Brush.Canvas.Pixels[0, 0] := clBtnShadow; 

    for i := 0 to 4 do 
    begin 
     Canvas.Draw(X, Y, Brush); 
     inc(X, DX); 
     inc(Y, DY); 
    end; 
    finally 
    Brush.Free; 
    end; 

end;