Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi TCheckbox问题覆盖WM_油漆_Delphi_Delphi 7_Wm Paint_Tcheckbox - Fatal编程技术网

Delphi TCheckbox问题覆盖WM_油漆

Delphi TCheckbox问题覆盖WM_油漆,delphi,delphi-7,wm-paint,tcheckbox,Delphi,Delphi 7,Wm Paint,Tcheckbox,我使用的是Delphi(7)的旧版本,但这并不重要。主题正在使用中。我需要控制复选框的背景和字体颜色以及复选框的文本。我已经修改了其他地方的一些代码,这些代码基本上可以正常工作,但我在整个应用程序中使用的Arial字体在手动绘制时边缘看起来非常粗糙。这是代码 type TCheckBox = class(StdCtrls.TCheckBox) private procedure WMErase(var Message: TWMEraseBkgnd); message WM_ERA

我使用的是Delphi(7)的旧版本,但这并不重要。主题正在使用中。我需要控制复选框的背景和字体颜色以及复选框的文本。我已经修改了其他地方的一些代码,这些代码基本上可以正常工作,但我在整个应用程序中使用的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;
如果我执行上面的继承调用,您可以在我在上面写的白色文本下面看到原始的黑色文本,但是白色文本看起来很漂亮,字体是圆形的。显然,继承函数中的某些东西正在以某种方式修复文本输出,但我不能真正按照它来解决问题。有人知道如何解决这个问题吗?如果需要,我可以发送一些结果的屏幕截图


此外,由于上面的代码没有继承调用,窗口上的大多数标签(与复选框无关)不会被绘制,除非我最小化和最大化程序。谢谢。

我建议您不要将继承的类命名为TCheckBox,因为您是从同名类继承的。我不知道这是否会导致任何问题,也不知道是什么导致了别名问题。@XylemFlow“我建议您不要将继承的类命名为TCheckBox,因为您是从同名的类继承的”-实际上,这是完全有效的。这通常称为插入器类。如果该类是在表单的单元中定义的,或者是在表单的
uses
子句的
StdCtrls
单元之后的单独单元中定义的,那么表单上的所有
TCheckBox
控件,甚至是在设计时创建的控件,都将在运行时替换为自定义类。这实际上是Delphi的一个特性,而不是一个bug。@Remy Lebeau感谢您的更正。知道这些很有用。