做个画图软件的几个问题 各位大能,本人想做个画图之类的功能,有画笔可以调大小,有橡皮搽;只求思路!请问:1、橡皮擦功能如何实现啊; 2、如何记录笔迹;说明:因为我所使用的VCL,如果每次窗体重绘都会清除掉所画的笔迹;谢谢大家! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 把你画的每个部件用tlist保存起来,再显示 开始我也是考虑TLIST,只是有些问题没有弄明白,比如,可以用TLIST保存笔迹,每次重绘重新画,如何安排TLIST也是个问题,还有就是橡皮的作用效果如果反应到TLIST中 这是我写的一个手写输入法的部分源代码,同你的要求类似:你放一个 TPAINTBOX 在 form1 上,代码自己写入述代码吧type //手写相关 TPOINTREC = Record pX : Smallint ; pY : Smallint ; pIs : Smallint ; //== 1 标志终点 否则为 0 End ; TfrmVODMain = class(TForm) ... public //手写相关 IsWriting : Boolean ; IsMoving : Boolean ; PointList : TList ; //手写相关 Procedure ClearImagePad ; Procedure ClearPointList ; Procedure ReDrawTrack ; end;procedure TfrmVODMain.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);var tmpPoint : ^TPOINTREC ;Begin IsWriting := True ; IsMoving := False ; New( tmpPoint ) ; tmpPoint.pX := X ; tmpPoint.pY := Y ; tmpPoint.PIs := 0 ; PointList.Add( tmpPoint ) ; PaintBox1.Canvas.MoveTo( X, Y ) ; glLastClickTime:=Now ; //mouse hook 无效 TimerHandWrite.Enabled :=False ;End ;procedure TfrmVODMain.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);Var tmpPoint : ^TPOINTREC ;Begin IsMoving := True ; case IsWriting of True: If ( X>=0 ) And ( Y>=0 ) And ( X<=PaintBox1.Width ) And ( Y<=PaintBox1.Height ) Then Begin PaintBox1.Canvas.LineTo( X, Y ) ; New( TmpPoint ) ; tmpPoint.pX := X ; tmpPoint.pY := Y ; tmpPoint.PIs := 0 ; PointList.Add( tmpPoint ) ; End; False: begin end; end;End ;procedure TfrmVODMain.PaintBox1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);Var tmpPoint : ^TPOINTREC ;Begin glLastClickTime:=Now ; IsWriting:=False ; If ( Not IsWriting ) And ( IsMoving ) Then Begin New( tmpPoint ) ; tmpPoint.pX := X ; tmpPoint.pY := Y ; tmpPoint.pIs := 1 ; PointList.Add( tmpPoint ) ; IdentifyTrack ; End ;End ;//==清空书写画布//==============================================================================Procedure TfrmVODMain.ClearImagePad ;Begin PaintBox1.Refresh ;End ;//==清除轨迹点列表内容//==============================================================================Procedure TfrmVODMain.ClearPointList ;Var I : Integer ; TmpPoint : ^TPointRec ;Begin For I:=PointList.Count-1 DownTo 0 Do Begin TmpPoint := PointList.Items[I] ; PointList.Delete( I ) ; if TmpPoint<>nil then begin Dispose( TmpPoint ) ; TmpPoint:=nil ; end; End ; PointList.Clear ;End ;//==//==============================================================================Procedure TfrmVODMain.ReDrawTrack ;Var i : Integer ; endFlag : Boolean ; tmpPoint : ^TPointRec ;Begin ClearImagePad ; If PointList.Count<=0 Then Exit ; endFlag := True ; For I:=0 To PointList.Count-1 Do Begin tmpPoint := PointList.Items[I] ; If endFlag Then Begin PaintBox1.Canvas.MoveTo( tmpPoint.pX, tmpPoint.pY ) ; endFlag := False ; End Else Begin PaintBox1.Canvas.LineTo( TmpPoint.pX, TmpPoint.pY ) ; End ; If tmpPoint.pIs=1 Then endFlag := True ; End ;End ;procedure TfrmVODMain.FormCreate(Sender: TObject);begin //手写相关 PointList := Tlist.Create ;end; 定义线 ,圆,长形,折线这些对象,用来保存所做的操作。然后将这些对象按顺序保存到 List.重次重绘时按保存的参数绘制就OK了。 感谢楼上的朋友解答,对于楼上我要说的就是,如果使用橡皮擦你们怎么样定义LIST,因为之前已经有了绘制的线条,而且橡皮擦无法知道擦除哪点? 用TList保存元素重绘的方式适用于矢量图,橡皮擦不适用于矢量图,你需要的是用一个TImage/TBitmap在后台保存画面,随时重绘到窗体的Canvas上。 LZ可以参考下:http://topic.csdn.net/u/20110331/02/D6330B1C-B4B3-4DF1-836F-CB08B48EDFE9.html#r_73340803 如何自动刷新数据 使用内存映像文件的问题 运行其它Exe,如何设置其它Exe的起始位置 如何实现TstringList中的内容复制??? 怎样解决delphi6下SOAP编程,客户端提取数据汉字显示乱码的问题? 请问大家一个关于菜单的问题 如何在应用程序中实现delphi控件的移动,就像设计阶段一样。 请问:在D7中开发的COM组件如何返回Recordset类型? 只要不是闲话都给分!好急! 想从Tfilestream继承一个新类来实现偏移读取文件 delphi2010 TSQLConnection控件的使用方法 救命,接到一个二维码项目,事关生死存亡,求大家高抬贵手帮帮小弟
你放一个 TPAINTBOX 在 form1 上,代码自己写入述代码吧
type
//手写相关
TPOINTREC = Record
pX : Smallint ;
pY : Smallint ;
pIs : Smallint ; //== 1 标志终点 否则为 0
End ; TfrmVODMain = class(TForm)
...
public
//手写相关
IsWriting : Boolean ;
IsMoving : Boolean ;
PointList : TList ;
//手写相关
Procedure ClearImagePad ;
Procedure ClearPointList ;
Procedure ReDrawTrack ;
end;
procedure TfrmVODMain.PaintBox1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
tmpPoint : ^TPOINTREC ;
Begin
IsWriting := True ;
IsMoving := False ;
New( tmpPoint ) ;
tmpPoint.pX := X ;
tmpPoint.pY := Y ;
tmpPoint.PIs := 0 ;
PointList.Add( tmpPoint ) ;
PaintBox1.Canvas.MoveTo( X, Y ) ;
glLastClickTime:=Now ; //mouse hook 无效
TimerHandWrite.Enabled :=False ;
End ;procedure TfrmVODMain.PaintBox1MouseMove(Sender: TObject;
Shift: TShiftState; X, Y: Integer);
Var
tmpPoint : ^TPOINTREC ;
Begin
IsMoving := True ;
case IsWriting of
True:
If ( X>=0 ) And ( Y>=0 ) And ( X<=PaintBox1.Width ) And ( Y<=PaintBox1.Height ) Then
Begin
PaintBox1.Canvas.LineTo( X, Y ) ;
New( TmpPoint ) ;
tmpPoint.pX := X ;
tmpPoint.pY := Y ;
tmpPoint.PIs := 0 ;
PointList.Add( tmpPoint ) ;
End;
False:
begin
end;
end;
End ;procedure TfrmVODMain.PaintBox1MouseUp(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
Var
tmpPoint : ^TPOINTREC ;
Begin
glLastClickTime:=Now ;
IsWriting:=False ;
If ( Not IsWriting ) And ( IsMoving ) Then
Begin
New( tmpPoint ) ;
tmpPoint.pX := X ;
tmpPoint.pY := Y ;
tmpPoint.pIs := 1 ;
PointList.Add( tmpPoint ) ;
IdentifyTrack ;
End ;End ;
//==清空书写画布
//==============================================================================
Procedure TfrmVODMain.ClearImagePad ;
Begin
PaintBox1.Refresh ;
End ;//==清除轨迹点列表内容
//==============================================================================
Procedure TfrmVODMain.ClearPointList ;
Var
I : Integer ;
TmpPoint : ^TPointRec ;
Begin
For I:=PointList.Count-1 DownTo 0 Do
Begin
TmpPoint := PointList.Items[I] ;
PointList.Delete( I ) ;
if TmpPoint<>nil then
begin
Dispose( TmpPoint ) ;
TmpPoint:=nil ;
end;
End ;
PointList.Clear ;
End ;//==
//==============================================================================
Procedure TfrmVODMain.ReDrawTrack ;
Var
i : Integer ;
endFlag : Boolean ;
tmpPoint : ^TPointRec ;
Begin
ClearImagePad ;
If PointList.Count<=0 Then Exit ;
endFlag := True ;
For I:=0 To PointList.Count-1 Do
Begin
tmpPoint := PointList.Items[I] ;
If endFlag Then
Begin
PaintBox1.Canvas.MoveTo( tmpPoint.pX, tmpPoint.pY ) ;
endFlag := False ;
End
Else
Begin
PaintBox1.Canvas.LineTo( TmpPoint.pX, TmpPoint.pY ) ;
End ;
If tmpPoint.pIs=1 Then endFlag := True ;
End ;
End ;procedure TfrmVODMain.FormCreate(Sender: TObject);
begin
//手写相关
PointList := Tlist.Create ;
end;
http://topic.csdn.net/u/20110331/02/D6330B1C-B4B3-4DF1-836F-CB08B48EDFE9.html#r_73340803