Delphi TextRect в Windows GDI

Есть ли аналог Delphi TextRect в GDI? Я посмотрел на DrawText, DrawTextEx, но не нашел того, что мне было нужно. Мне нужно нарисовать процентный текст индикатора выполнения, который разделен на две части цвета, например. левая часть текста черная, правая белая. Так как обычно во всех прогрессбарах.

введите здесь описание изображения

Спасибо за ваши ответы!


person maxfax    schedule 28.08.2011    source источник
comment
В GDI вы можете использовать TextOut и DrawText (DrawTextEx). Они содержат больше возможностей, чем функции Delphi. Какую именно функцию вы ищете? Как выглядит ваш код TCanvas? Почему вы считаете, что вам нужно отказаться от TCanvas?   -  person Andreas Rejbrand    schedule 28.08.2011
comment
но мне нужна основная идея TextRect (где я могу вырезать часть текста и не рисовать его). Я не вижу этого в DrawText/Ex. Пожалуйста, посмотрите размещенную картинку, мне нужно нарисовать текст, как в TGauge (или других индикаторах выполнения).   -  person maxfax    schedule 28.08.2011


Ответы (1)


Вы ищете ExtTextOut функция.

Образец:

procedure TForm4.FormPaint(Sender: TObject);
const
  S = 'This is a sample text';
begin
  ExtTextOut(Canvas.Handle, 10, 10, ETO_CLIPPED,
    Rect(40, 10, 100, 100), PChar(S), length(S), nil)    
end;

Но я думаю, что вы действительно хотите сделать, это нарисовать 'NOT-colored текст':

procedure DrawTextNOT(const hDC: HDC; const Font: TFont; const Text: string; const X, Y: integer);
begin
  with TBitmap.Create do
    try
      Canvas.Font.Assign(Font);
      with Canvas.TextExtent(Text) do
        SetSize(cx, cy);
      Canvas.Brush.Color := clBlack;
      Canvas.FillRect(Rect(0, 0, Width, Height));
      Canvas.Font.Color := clWhite;
      Canvas.TextOut(0, 0, Text);
      BitBlt(hDC, X, Y, Width, Height, Canvas.Handle, 0, 0, SRCINVERT);
    finally
      Free;
    end;
end;

procedure TForm4.FormPaint(Sender: TObject);
const
  S = 'This is a sample text';
var
  ext: TSize;
begin
  Canvas.Brush.Color := clBlack;
  Canvas.FillRect(Rect(0, 0, Width div 2, Height));
  Canvas.Brush.Color := clWhite;
  Canvas.FillRect(Rect(Width div 2, 0, Width, Height));
  ext := Canvas.TextExtent(S);

  DrawTextNOT(Canvas.Handle, Canvas.Font, S, (Width - ext.cx) div 2,
    (Height - ext.cy) div 2);
end;

Screenshot
(источник: rejbrand.se)

person Andreas Rejbrand    schedule 28.08.2011
comment
@maxfax: Хорошо, сейчас (лучше поздно, чем никогда - иногда я немного "медленный"...) Я вижу, чего вам не хватает в TextRect. Функция WinAPI, которую вы ищете, это ExtTextOut. Тем не менее, мне интересно, не проще ли просто нарисовать один НЕ цветной текст... - person Andreas Rejbrand; 28.08.2011