加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 将Canvas添加到TScrollBox

发布时间:2020-12-15 09:25:56 所属栏目:大数据 来源:网络整理
导读:我想做一件简单的事情:在TScrollBox后代上添加一个Canvas属性.我看过 this article 但我的ScrollBox后代根本不在画布上绘制.愿有人告诉我,有什么不对吗? TfrmScrollContainer = class (TScrollBox) private FCanvas: TCanvas; FControlState:TControlState
我想做一件简单的事情:在TScrollBox后代上添加一个Canvas属性.我看过 this article

但我的ScrollBox后代根本不在画布上绘制.愿有人告诉我,有什么不对吗?

TfrmScrollContainer = class (TScrollBox)
  private
    FCanvas: TCanvas; 
    FControlState:TControlState;
    procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
  protected
    procedure Paint;
    procedure PaintWindow(DC: HDC); override;
    property Canvas: TCanvas read FCanvas;
  public
    constructor Create(AOwner: TComponent);  override;
    destructor Destroy; override;
  end;

…这是精确的副本,TWincontrol如何转向TCustomControl(但它在某处失败)

constructor TfrmScrollContainer.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FCanvas := TControlCanvas.Create;
  TControlCanvas(FCanvas).Control := Self;
end;

destructor TfrmScrollContainer.Destroy;
begin
  FCanvas.Free;
  inherited Destroy;
end;

procedure TfrmScrollContainer.WMPaint(var Message: TWMPaint);
begin
  Include(FControlState,csCustomPaint);
  inherited;
  Exclude(FControlState,csCustomPaint);
end;

procedure TfrmScrollContainer.PaintWindow(DC: HDC);
begin
  FCanvas.Lock;
  try
    FCanvas.Handle := DC;
    try
      TControlCanvas(FCanvas).UpdateTextFlags;
      Paint;
    finally
      FCanvas.Handle := 0;
    end;
  finally
    FCanvas.Unlock;
  end;
end;

procedure TfrmScrollContainer.Paint;    // this is not executed (I do not see any ellipse)
begin
  Canvas.Brush.Color:=clRed;
  Canvas.Ellipse(ClientRect);
end;

感谢名单

解决方法

您没有将csCustomPaint包含到ControlState中,而是将其包含在您声明的类似命名的字段中.您的字段未被检查,上升控件对此一无所知.要解决,更换

procedure TfrmScrollContainer.WMPaint(var Message: TWMPaint);
begin
  Include(FControlState,csCustomPaint);
end;

procedure TfrmScrollContainer.WMPaint(var Message: TWMPaint);
begin
  ControlState := ControlState + [csCustomPaint];
  inherited;
  ControlState := ControlState - [csCustomPaint];
end;

或者,您的滚动框可以为您的自定义绘画提供任何控件.继承的WM_PAINT处理程序检查以查看控件计数,如果它不为0则调用paint处理程序而不是将消息传递给默认处理程序.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读