你好,现在我没解决的问题是:鼠标移动快了的话,不能连续取像素点数组Y_Values[x];=y;但画线还是可以连续的。我的画线代码在下面: procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin if ((X>=0) and (X<=512)) and ((Y>=0) and (Y<=350)) then begin label1.Caption :='X:'+inttostr(x)+' Y:'+inttostr(y); if (drawing) then begin paintbox1.Canvas.MoveTo(lastdot.X ,lastdot.Y ); paintbox1.Canvas.LineTo(x,y);//以上两句为画线,画线是连续的 lastdot:=point(x,y); Y_Values[x]:=y;//存的像素点数组,但不是连续的 end; end;代码贴出来了,请大家看看。end;
to linyuzhi: 现在数据可以取到了,谢谢; 不过,还有一个问题,就是在画了波形之后,想擦除原来波形但擦除不了。我的部分主要代码如下: procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin if drawing then begin paintbox1.Canvas .pen.Mode:=pmnotxor; paintbox1.Canvas.MoveTo(move_current.X ,move_current.Y ); paintbox1.Canvas.LineTo(move_Y_Values.x,move_Y_Values.y); move_current:=point(x,y);//当前鼠标的位置x,y轴 move_Y_Values:=point(x,Y_Values[x]);//Y_Values[x]为波形的Y轴 paintbox1.Canvas.MoveTo(move_current.X ,move_current.Y ); paintbox1.Canvas.LineTo(move_Y_Values.x,move_Y_Values.y); end; end; end; //我的本意:是想通过移动画线,一个像素一个像素擦除; //但是:我移动画线后,波形没能擦除; //帖子加分:)
DirectInput是不是delphiX控件,缓冲模式是不是在delphiX里面设置的?能不能说的再具体点
1,在图上画一个任意波形,然后把波形转换为波形数据,波形数组为Y_Values[x];=y;(x,y为捕捉到的TPoint类型);
2,如果我不能捕捉到连续的移动事件x,y值,那我就得不到波形数组了!
3,现在的问题是:我鼠标移动快了的话,确实捕捉不到连续的x,y值,我单步调试过了。 再加分,期待高手们出手相助~~
记得当年586电脑刚刚盛行时,有位高手在486平台下写了个游戏,还挺不错,唯一的缺点就是在586电脑上运行时动作过快。所以那位游戏的作者就建议大家玩这个游戏时,先打开word、photoshop之类的软件,让电脑运行能慢一点,然后再游戏。呵呵,居然这个也是方法
当然如果是在画布上叠图,是会断点,我在做旋转画笔时也遇到这个问题....
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls,Gdiplus,GDIPUTIL;type
TForm1 = class(TForm)
btn1: TButton;
img1: TImage;
procedure FormCreate(Sender: TObject);
procedure img1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure img1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
procedure img1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
pGd : TGpGraphics;{ Public declarations }
aPen : TGpPen;
aPoint : array of TGpPoint;
ox,oy : Integer;
aCount : Integer;
FMouseDown : Boolean;
aBmp : TBitmap;
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
begin
pGd := TGpGraphics.Create(img1.Canvas.Handle);
aPen := TGpPen.Create(ARGBFromTColor(clBlue),10);
aPen.LineJoin := LineJoinRound;
aPen.StartCap := lcRound;
aPen.EndCap := lcRound;
end;procedure TForm1.FormDestroy(Sender: TObject);
begin
pGd.Free;
aPen.Free;
end;procedure TForm1.img1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
FMouseDown := True;
SetLength(aPoint,1);
ox := x;oy := y;
aPoint[0].X := X; aPoint[0].Y := Y;
end;procedure TForm1.img1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if not FMouseDown then Exit; SetLength(aPoint,Length(aPoint) + 1);
aPoint[Length(aPoint) - 1].X := X;
aPoint[Length(aPoint) - 1].Y := Y;
if Length(aPoint) = 1 then Exit;
pGd.DrawLines(aPen,aPoint);
img1.Repaint;
end;procedure TForm1.img1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
FMouseDown := False;
end;end.
不知道你用的那个版本的GDIPlus
我在csdn上下一个 是王锐改版的那个 但好像和你的代码对应不上去啊
pGd.DrawLines(aPen,aPoint);
我的是delphi2007,跟进去也没看出所以然来……
你可发看看你自己的GDI+源代码,照着改一下就可以了,版本的不同也就是修改的人用不同的方法封装和调用了相同的DLL
你好,现在我没解决的问题是:鼠标移动快了的话,不能连续取像素点数组Y_Values[x];=y;但画线还是可以连续的。我的画线代码在下面:
procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if ((X>=0) and (X<=512)) and ((Y>=0) and (Y<=350)) then
begin
label1.Caption :='X:'+inttostr(x)+' Y:'+inttostr(y);
if (drawing) then
begin
paintbox1.Canvas.MoveTo(lastdot.X ,lastdot.Y );
paintbox1.Canvas.LineTo(x,y);//以上两句为画线,画线是连续的
lastdot:=point(x,y);
Y_Values[x]:=y;//存的像素点数组,但不是连续的
end;
end;代码贴出来了,请大家看看。end;
现在数据可以取到了,谢谢;
不过,还有一个问题,就是在画了波形之后,想擦除原来波形但擦除不了。我的部分主要代码如下:
procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if drawing then
begin
paintbox1.Canvas .pen.Mode:=pmnotxor;
paintbox1.Canvas.MoveTo(move_current.X ,move_current.Y );
paintbox1.Canvas.LineTo(move_Y_Values.x,move_Y_Values.y);
move_current:=point(x,y);//当前鼠标的位置x,y轴
move_Y_Values:=point(x,Y_Values[x]);//Y_Values[x]为波形的Y轴
paintbox1.Canvas.MoveTo(move_current.X ,move_current.Y );
paintbox1.Canvas.LineTo(move_Y_Values.x,move_Y_Values.y);
end;
end;
end;
//我的本意:是想通过移动画线,一个像素一个像素擦除;
//但是:我移动画线后,波形没能擦除;
//帖子加分:)
贴图片方法这个比较简单,就是不知道怎样擦除?
感谢回复!
在网上查了一下资料,有人说用重画,于是我自己写了一段代码如下:
procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
paintbox1.Canvas .pen.Mode:=pmnotxor;
paintbox1.Canvas .moveto(x,Y_Values[x]);//Y_Values[x]函数是波形X轴对应的Y值
paintbox1.Canvas .lineto(x+1,Y_Values[x+1]);
end;
以上我的意思是通过一个像素点一个像素点擦除的(即重画),但是,当我鼠标移动快的话,波形有些点就擦除不干净了,原因我想就是鼠标移动太快捕捉不到波形上的点,请问这个问题如何解决?
paintbox的mousemove之前先清除画布
比如在mouseDOWN的时候
paintbox.canvas.brush.color := clwhite;
paintbox.canvas.fillrect(paintbox.canvas.cliprect);
擦除就是不把被擦除的部分画上去,其他部分都画就成了。