我在image上用鼠标画线的代码如下:
procedure TForm2.ImageOnMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
MouseDownClick:=true;
image1.Canvas.MoveTo(x ,y);
origin.X :=x ;
origin.Y :=y ;
MovePt:=origin;
end;
procedure TForm2.ImageOnMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
tx,ty,dx,dy,temp:integer;begin
if MouseDownClick=true then
begin
Draw(origin,movept,pmnotxor);//画线过程,笔的MODE设为pmnotxor
movept.X:=x ;
movept.Y:=y ;
draw(origin,movept,pmnoyxor);
end;
end;procedure TForm2.ImageOnMouseUP(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin Draw(origin,movept,pmcopy);//在mouseup时采用pmcopy模式再画一次
MouseDownClick:=false;
end;procedure TForm2.Draw(TopLeft,ButtomRight:TPoint;AMode:TpenMode) ;
begin
image1.Canvas.Pen.Mode :=AMode;
image1.Canvas.MoveTo(TopLeft.X,Topleft.Y);
image1.Canvas.LineTo(buttomright.X,buttomright.Y ); end;
以上的代码画线没有问题,而且现在的书上以及网上的资料绝大部分都是介绍采用pmnotxor模式这样画直线,但出现这样一个小的细节部分,就是当鼠标在画线过程中,经过已经存在的直线时有交叉的地方会显示为底色而不是笔的颜色,请问这是为什么?有什么办法可以解决?
为什么DELPHI自带的imageeditor里画线时不会出现这种情况?window的画笔程序也不会出现.他们采用什么方法画线的?
procedure TForm2.ImageOnMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
MouseDownClick:=true;
image1.Canvas.MoveTo(x ,y);
origin.X :=x ;
origin.Y :=y ;
MovePt:=origin;
end;
procedure TForm2.ImageOnMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
tx,ty,dx,dy,temp:integer;begin
if MouseDownClick=true then
begin
Draw(origin,movept,pmnotxor);//画线过程,笔的MODE设为pmnotxor
movept.X:=x ;
movept.Y:=y ;
draw(origin,movept,pmnoyxor);
end;
end;procedure TForm2.ImageOnMouseUP(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin Draw(origin,movept,pmcopy);//在mouseup时采用pmcopy模式再画一次
MouseDownClick:=false;
end;procedure TForm2.Draw(TopLeft,ButtomRight:TPoint;AMode:TpenMode) ;
begin
image1.Canvas.Pen.Mode :=AMode;
image1.Canvas.MoveTo(TopLeft.X,Topleft.Y);
image1.Canvas.LineTo(buttomright.X,buttomright.Y ); end;
以上的代码画线没有问题,而且现在的书上以及网上的资料绝大部分都是介绍采用pmnotxor模式这样画直线,但出现这样一个小的细节部分,就是当鼠标在画线过程中,经过已经存在的直线时有交叉的地方会显示为底色而不是笔的颜色,请问这是为什么?有什么办法可以解决?
为什么DELPHI自带的imageeditor里画线时不会出现这种情况?window的画笔程序也不会出现.他们采用什么方法画线的?
解决方案 »
- 如何调用函数
- 怎么样得到别的应用程序里面的dbgrid里的具体内容 我text文本框能够取到 dbgrid的怎样得到啊
- 朋友写的一个仿foxmail的滚动提示条,大家看看觉得怎么样.
- 怎么设置,获得checklistbox中的值?
- 做一个可以用jave脚本在浏览器端进行调用的activeX控件用哪种工程类型比较好
- 又来送分了!问一下delphi有没有vb哪个即时窗口!?
- 支付宝加密方式
- 求书--我想找一些关于写控件的书,大家能给我一些意见吗
- 调用自动化服务器的后期捆绑如何实现???急,谢谢
- 谁做过点歌系统!?
- 用insert into 插入数据不完整?
- 请教:vc与delphi在图像处理开发方面有何优劣?
-----------
应该不会,见 \Delphi7\Demos\Doc\Graphex 下面的例子procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Drawing := True;
Image.Canvas.MoveTo(X, Y);
Origin := Point(X, Y);
MovePt := Origin;
StatusBar1.Panels[0].Text := Format('Origin: (%d, %d)', [X, Y]);
end;procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Drawing then
begin
DrawShape(Origin, Point(X, Y), pmCopy);
Drawing := False;
end;
end;procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if Drawing then
begin
DrawShape(Origin, MovePt, pmNotXor);
MovePt := Point(X, Y);
DrawShape(Origin, MovePt, pmNotXor);
end;
StatusBar1.Panels[1].Text := Format('Current: (%d, %d)', [X, Y]);
end;
//Image1作为最底层
//Image2作为最上层(预览层),进行透明绘制procedure TForm1.Image2MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
tx, ty, dx, dy, temp: integer;
begin
if ssLeft in Shift then
begin
movept := Point(X, Y);
Draw(origin, movept, False);
end;
end;procedure TForm1.Image2MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Draw(origin, movept, True);
end;procedure TForm1.Draw(TopLeft, ButtomRight: TPoint; mNotTry: Boolean{ 是否不是预览 });
var
vImage: TImage;
begin
if mNotTry then
vImage := Image1
else begin
vImage := Image2;
vImage.Canvas.FillRect(vImage.Canvas.ClipRect);
end;
vImage.Canvas.MoveTo(TopLeft.X, Topleft.Y);
vImage.Canvas.LineTo(buttomright.X, buttomright.Y);
Repaint;
end;procedure TForm1.Image2MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
origin := Point(X, Y);
MovePt := origin;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
DoubleBuffered := True;
Image1.Canvas.FillRect(Image1.Canvas.ClipRect);
Image2.BoundsRect := Image1.BoundsRect;
Image2.Canvas.FillRect(Image2.Canvas.ClipRect);
Image2.Transparent := True;
Image2.Picture.Bitmap.TransparentColor := clWindow;
end;
解决的办法,上面已经有了一种,个人感觉层是一种比较好的方式.