首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向TScrollBox添加画布

向TScrollBox添加画布
EN

Stack Overflow用户
提问于 2013-08-15 00:27:11
回答 1查看 2.3K关注 0票数 5

我试图做一件简单的事情:在TScrollBox后代上添加一个画布属性。我读过this article

但是我的ScrollBox后裔根本就没有在画布上画画。谁能告诉我,出什么事了?

代码语言:javascript
复制
  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的(但是它在某个地方失败了)

代码语言:javascript
复制
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;

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-15 00:50:41

您不包括csCustomPaintControlState,而是将它包含到您声明的同名字段中。您的字段不被检查,上升控件不知道有关它的任何信息。解决,替换

代码语言:javascript
复制
procedure TfrmScrollContainer.WMPaint(var Message: TWMPaint);
begin
  Include(FControlState, csCustomPaint);
  inherited;
  Exclude(FControlState, csCustomPaint);
end;

使用

代码语言:javascript
复制
procedure TfrmScrollContainer.WMPaint(var Message: TWMPaint);
begin
  ControlState := ControlState + [csCustomPaint];
  inherited;
  ControlState := ControlState - [csCustomPaint];
end;

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

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18244481

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档