Проблемы 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;
Если я выполню унаследованный вызов выше, вы увидите исходный черный текст под белым текстом, который я пишу поверх, но белый текст выглядит хорошо с закругленным шрифтом. Очевидно, что-то в унаследованных функциях каким-то образом исправляет вывод текста, но я не могу понять, что именно. Кто-нибудь знает, как исправить проблему? При необходимости могу прислать скриншоты результата.
Кроме того, с приведенным выше кодом без унаследованного вызова большинство меток в окне, не связанных с флажком, не окрашиваются, если я не минимизирую и не максимизирую программу. Спасибо.