请教如何在scrollbox上画图才不会被抹掉?(100分)

  • 主题发起人 主题发起人 kmyt
  • 开始时间 开始时间
K

kmyt

Unregistered / Unconfirmed
GUEST, unregistred user!
在form上画图,调用onpaint方法,可以包镇保证所画的图形不会被抹掉,但在scrollbox上
的图形无法保留,请问如何让scrollbox和form一样能保证图画不会被抹掉。
 
直接画在SCROLLBOX上???
如果不是这样调用ONPAINT是一样的呀?!
 
scrollbox上画图的代码:
procedure TForm1.drawline();
var
C:TCanvas;
x1,x2,y1,y2:longint;
begin
c:=TControlCanvas.Create;
TControlCanvas(c).Control:=scrollbox1;
c.pen.width:=1;
c.Pen.Color:=clBlack;
c.moveto(x1,y1);
c.lineto(x2,y2);
c.free;
end;
 
要不,你写个控件,拦截重画的消息,~0~
 
简单点的办法有吗?,别告诉我用Timer;
 
另外建立一个Bitmap,画在Bitmap.canvas上,然后把此Bitmap画在ScrollBox上。OnPaint
时也只需将Bitmap 画在ScrollBox上即可,很快的。
 
to吕雪松:
我的问题你可能理解错了。我是想知道如何在scrollbox上画图,并且象form上那样不会
被抹掉。以为tform有canvas属性而scrollbox没有。
 
Tform重画的时候重画scrollbox
 
to cook:
how to repaint;for example...
 
你需要重栽WM_Paint消息,在Scrollbox发生滚动后,置无效区,重画图象。
如果图象不是特别大,可以简单的重绘整个图象。

 
to wk_knife:
我的确重载了WM_Paint消息,但没用。能给个例子吗?
 
procedure TForm1.Button1Click(Sender: TObject);
var
CC : TCanvas;
begin
CC := TCanvas.Create;
CC.Handle := GetDC(ScrollBox1.Handle);
CC.Ellipse(100,100,200,200);
ReleaseDC(ScrollBox1.Handle,CC.Handle);
CC.Free;

end;
 
to吕雪松:
没错,你的代码可以在scrollbox上画图。但用一个小窗在上面一盖就没了。即使你在form.paint
中加入该代码。我的问题就是如何解决重绘的问题。
 
话已经说到这里了,你应该可以明白了。

写一个函数,然后CC.OnPaint := YourFunction;
处理重绘的问题。

可以用我前面说的那个方法。
 
to吕雪松:
我就是不会写SCROLLBOX的onpaint了。再帮忙给个具体点的代码。
 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TMyScrollBox = class(TScrollBox)
public
CC : TCanvas;
public
Buf : TBitmap;
constructor Create(AOwner : TComponent);override;
destructor Destroy;override;
procedure Paint(var Message: TWMPaint); message WM_PAINT;
end;

TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
ScrollBox1: TMyScrollBox;
procedure DoPaint;

end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.DoPaint;
begin
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
ScrollBox1 := TMyScrollBox.Create(Self);
ScrollBox1.Parent := Self;
end;

procedure TMyScrollBox.Paint(var Message: TWMPaint);
begin
CC.Handle := GetDC(Handle);
CC.Draw(0,0,Buf);
ReleaseDC(Handle,CC.Handle);
end;

constructor TMyScrollBox.Create(AOwner : TComponent);
begin
inherited Create(AOwner);
CC := TCanvas.Create;
Buf := TBitmap.Create;
Width := 100;
Height := 100;
Buf.Width := Width;
Buf.Height := Height;
end;

destructor TMyScrollBox.Destroy;
begin
CC.Free;
Buf.Free;
inherited;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ScrollBox1.Buf.Canvas.Ellipse(0,0,100,100);
end;

end.

不过我觉得可以有更好的实现方法,可以去看看一些控件的代码。
 
接受答案了.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部