Проблемы Delphi TCheckbox при замене WM_PAINT

Я использую старую версию Delphi (7), но это не должно иметь большого значения. Темы уже используются. Мне нужно контролировать фон и цвет шрифта флажка и текста TCheckbox. Я адаптировал некоторый код, найденный в другом месте, который в основном работает, но шрифт Arial, который я использую во всем приложении, выглядит очень грубым по краям при рисовании вручную. Это код.

      type
  TCheckBox = class(StdCtrls.TCheckBox)
  private
    procedure WMErase(var Message: TWMEraseBkgnd); message WM_ERASEBKGND;
    procedure WMPaint (var Message: TWMPaint); message WM_PAINT;
  end;

procedure TCheckBox.WMErase(var Message: TWMEraseBkgnd);
var
  canv: TControlCanvas;
begin
  canv := TControlCanvas.Create;
  canv.Control := Self;
  canv.Brush.Color := Self.Color;
  canv.FillRect(canv.ClipRect);
  canv.free;
end;

procedure TCheckBox.WMPaint(var Message: TWMPaint);
const
  SPACE: Integer = 2;
var
  txtW, txtH, txtX, BtnWidth: Integer;
  canv: TControlCanvas;
begin
  //inherited;
  BtnWidth := GetSystemMetrics(SM_CXMENUCHECK);
  canv := TControlCanvas.Create;
  try
    canv.Control := Self;
    canv.Font := Font;
    txtW:= canv.TextWidth(Caption);
    txtH:= canv.TextHeight(Caption);
    if BiDiMode in [bdRightToLeft, bdRightToLeftReadingOnly] then
      txtX:= Width - BtnWidth - SPACE - txtW
    else
      txtX:= BtnWidth + SPACE;
    SetBkMode(canv.Handle,TRANSPARENT);
    StateImages.Draw(canv,0,0,Ord(Self.Checked)); // checkbox
    canv.TextOut(txtX, (Height - txtH) div 2 + 1, Caption);
  finally
    canv.Free;
  end;
end;

Если я выполню унаследованный вызов выше, вы увидите исходный черный текст под белым текстом, который я пишу поверх, но белый текст выглядит хорошо с закругленным шрифтом. Очевидно, что-то в унаследованных функциях каким-то образом исправляет вывод текста, но я не могу понять, что именно. Кто-нибудь знает, как исправить проблему? При необходимости могу прислать скриншоты результата.

Кроме того, с приведенным выше кодом без унаследованного вызова большинство меток в окне, не связанных с флажком, не окрашиваются, если я не минимизирую и не максимизирую программу. Спасибо.

0 ответов

Другие вопросы по тегам