2015-12-14 1 views
0

Мне нужно изменить цвет шрифта пары моих панелей StatusBar, поэтому я использую событие DrawPanel для StatusBar. Тем не менее, мне нужно править Выровнять последние две панели. Это возможно?Выравнивать текст в Владелец Рисованные панели TStatusBar в Lazarus

procedure TfrmMain.StatusBar1DrawPanel(StatusBar: TStatusBar; 
    Panel: TStatusPanel; const Rect: TRect); 
begin 
StatusBar.Canvas.Font.Name := 'Times New Roman'; 
StatusBar.Canvas.Font.Style := []; 
StatusBar.Canvas.Font.Size := 12; 
StatusBar.Canvas.Font.Color := clBlack; 
if Panel.Index = 2 then 
begin 
    StatusBar.Canvas.TextRect(Rect,Rect.Left,Rect.Top, 'TOTALS:'); 
end; 
if Panel.Index = 3 then 
begin 
    StatusBar.Canvas.Font.Color := clRed; 
    StatusBar.Canvas.TextRect(Rect,Rect.Left,Rect.Top, TotalQty); 
end; 
if Panel.Index = 4 then 
begin 
    StatusBar.Canvas.Font.Color := clRed; 
    StatusBar.Canvas.TextRect(Rect,Rect.Left,Rect.Top, TotalStr); 
end; 
end; 

ответ

1

В Delphi TCanvas имеет перегруженный TextRect() метод, который принимает параметр TextFormat в качестве входных данных:

procedure TfrmMain.StatusBar1DrawPanel(StatusBar: TStatusBar; 
    Panel: TStatusPanel; const Rect: TRect); 
begin 
    StatusBar.Canvas.Font.Name := 'Times New Roman'; 
    StatusBar.Canvas.Font.Style := []; 
    StatusBar.Canvas.Font.Size := 12; 
    StatusBar.Canvas.Font.Color := clBlack; 
    case Panel.Index of 
    2: begin 
     StatusBar.Canvas.TextRect(Rect, Rect.Left, Rect.Top, 'TOTALS:'); 
    end; 
    3: begin 
     StatusBar.Canvas.Font.Color := clRed; 
     StatusBar.Canvas.TextRect(Rect, TotalQty, [tfRight]); 
    end; 
    4: begin 
     StatusBar.Canvas.Font.Color := clRed; 
     StatusBar.Canvas.TextRect(Rect, TotalStr, [tfRight]); 
    end; 
    end; 
end; 

В FreePascal, TCanvas имеет перегруженный TextRect() метод, который принимает параметр Style в качестве входных данных:

procedure TfrmMain.StatusBar1DrawPanel(StatusBar: TStatusBar; 
    Panel: TStatusPanel; const Rect: TRect); 
var 
    Style: TTextStyle; 
begin 
    StatusBar.Canvas.Font.Name := 'Times New Roman'; 
    StatusBar.Canvas.Font.Style := []; 
    StatusBar.Canvas.Font.Size := 12; 
    StatusBar.Canvas.Font.Color := clBlack; 
    case Panel.Index of 
    2: begin 
     StatusBar.Canvas.TextRect(Rect, Rect.Left, Rect.Top, 'TOTALS:'); 
    end; 
    3: begin 
     StatusBar.Canvas.Font.Color := clRed; 
     Style.Alignment := taRightJustify; 
     // set other Style settings as needed... 
     StatusBar.Canvas.TextRect(Rect, Rect.Left, Rect.Top, TotalQty, Style); 
    end; 
    4: begin 
     StatusBar.Canvas.Font.Color := clRed; 
     Style.Alignment := taRightJustify; 
     // set other Style settings as needed... 
     StatusBar.Canvas.TextRect(Rect, Rect.Left, Rect.Top, TotalStr, Style); 
    end; 
    end; 
end; 

Если вы используете версию Delphi/FreePascal, которая не есть те параметры, вам придется использовать API DrawText() функцию Win32 непосредственно вместо:

procedure TfrmMain.StatusBar1DrawPanel(StatusBar: TStatusBar; 
    Panel: TStatusPanel; const Rect: TRect); 
var 
    TextRect: TRect; 
begin 
    StatusBar.Canvas.Font.Name := 'Times New Roman'; 
    StatusBar.Canvas.Font.Style := []; 
    StatusBar.Canvas.Font.Size := 12; 
    StatusBar.Canvas.Font.Color := clBlack; 
    case Panel.Index of 
    2: begin 
     StatusBar.Canvas.TextRect(Rect, Rect.Left, Rect.Top, 'TOTALS:'); 
    end; 
    3: begin 
     StatusBar.Canvas.Font.Color := clRed; 
     TextRect := Rect; 
     DrawText(StatusBar.Canvas.Handle, PChar(TotalQty), Length(TotalQty), TextRect, DT_RIGHT); 
     // alternatively, to avoid making a copy: 
     //DrawText(..., PRect(@Rect)^, ...); 
    end; 
    4: begin 
     StatusBar.Canvas.Font.Color := clRed; 
     TextRect := Rect; 
     DrawText(StatusBar.Canvas.Handle, PChar(TotalStr), Length(TotalStr), TextRect, DT_RIGHT); 
     // alternatively, to avoid making a copy: 
     //DrawText(..., PRect(@Rect)^, ...); 
    end; 
    end; 
end; 
+0

У меня есть, что перегруженная версия с параметром стиля, однако, когда я применяю стиль, я тогда потерять все форматирование Canvas шрифта Я сделал, и фон изменился на белый – JakeSays

+0

Ваш ответ работает, за исключением того, что Rect является Const и он запрашивает Var. Итак, вам нужно объявить локальный var (например, TextRect: TRect), а затем назначить значение параметров const Rect локальной переменной и передать это вместо этого - например. .... TextRect, DT_RIGHT); – JakeSays

+1

Вместо того, чтобы делать копию, вы можете в качестве альтернативы взять указатель на 'const' Rect и deference it, который отменит' const', например: '..., PRect (@Rect) ^, DT_RIGHT);' –

 Смежные вопросы

  • Нет связанных вопросов^_^