2012-03-29 56 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;