首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

做个画图软件的几个小问题

2012-02-13 
做个画图软件的几个问题各位大能,本人想做个画图之类的功能,有画笔可以调大小,有橡皮搽;只求思路!请问:1、

做个画图软件的几个问题
各位大能,本人想做个画图之类的功能,有画笔可以调大小,有橡皮搽;只求思路!
请问:1、橡皮擦功能如何实现啊;
  2、如何记录笔迹;说明:因为我所使用的VCL,如果每次窗体重绘都会清除掉所画的笔迹;
谢谢大家!

[解决办法]
把你画的每个部件用tlist保存起来,再显示
[解决办法]
帮顶。
[解决办法]
关注。。。。。。
[解决办法]
这是我写的一个手写输入法的部分源代码,同你的要求类似:
你放一个 TPAINTBOX 在 form1 上,代码自己写入述代码吧

[code=Delphi(Pascal)][/code]
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了。
[解决办法]
现在有的手机软件功能越来越强大了。
[解决办法]
用TList保存元素重绘的方式适用于矢量图,橡皮擦不适用于矢量图,你需要的是用一个TImage/TBitmap在后台保存画面,随时重绘到窗体的Canvas上。
[解决办法]
LZ可以参考下:
http://topic.csdn.net/u/20110331/02/D6330B1C-B4B3-4DF1-836F-CB08B48EDFE9.html#r_73340803

热点排行