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,Ord(Self.Checked)); // checkBox
    canv.textout(txtX,(Height - txtH) div 2 + 1,Caption);
  finally
    canv.Free;
  end;
end;

如果我执行上面的继承调用,您可以看到我写在顶部的白色文本下方的原始黑色文本,但白色文本看起来不错,带有圆形字体。显然,继承函数中的某些内容正在以某种方式修复文本输出,但我无法真正遵循它来确定什么。有谁知道如何解决这个问题?如有必要,我可以发送一些结果的屏幕截图。

此外,在没有继承调用的情况下,上面的代码就位,窗口上的大多数标签,与复选框无关,除非我最小化和最大化程序,否则不会被绘制。谢谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)