Image1.canvas.MoveTo(0,20);
Image1.canvas.LineTo(112,24);
画上箭头做标记,如何实现!
Image1.canvas.LineTo(112,24);
画上箭头做标记,如何实现!
解决方案 »
- actionlist不能控制edit和combobox等控件的可见性?
- 设ie为默认浏览器,求代码一段,谢谢!
- cxGrid的cellDbClick事件怎么不执行?
- 如何编程实现Sock5的代理服务,最好有源码(delphi的)!
- 我是菜鸟
- ADOQuery控件的delete问题
- 鸟菜问题!!!!!!!!!!!!!!!!!!!
- 立即给分.
- 新手提几个问题!
- !!!!!!!!!!!!!!!!!!!!!!!!!!超级傻问题,帮帮忙!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1
- ActiveFormDestroy为什么不能触发(在线给分)
- 如何在DBGRID或者STRINGGRID中实现用滚轮进行翻页的功能,就象浏览网页一样?菜问题一个~
Image1.canvas.LineTo(312,324);
Image1.canvas.MoveTo(300,300);
Image1.canvas.LineTo(312,324);
Image1.canvas.MoveTo(296,320);
Image1.canvas.LineTo(312,324);
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;const
Penwidth = 5;//画笔的粗细
Len = 20;//箭头线的长度
{说明:这两个常量应该一起变化,具体值由效果来定。
当Penwidth很小时,显示的效果不是太好}type
TForm1 = class(TForm)
procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure FormShow(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
xs, ys: integer;//画线开始处的坐标
xt, yt: integer;//记录鼠标前一时刻的坐标
xl, yl: integer;//记录第一条箭头线的端点坐标
xr, yr: integer;//记录第二条箭头线的端点坐标
b: boolean;//判断是否已经开始画线implementation{$R *.dfm}procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
b := False;
end;procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
xs := x;
ys := y;
xt := x;
yt := y;
xl := -1;
yl := -1;
xr := -1;
yr := -1;
b := True;
end;procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if b then
begin
Form1.Canvas.Pen.Mode := pmNotXor;
Form1.Canvas.Pen.Color := clRed;
Form1.Canvas.Pen.Width := PenWidth;
Form1.Canvas.MoveTo(xs, ys);
Form1.Canvas.LineTo(xt, yt);
Form1.Canvas.MoveTo(xs, ys);
Form1.Canvas.LineTo(x, y);
if xl <> -1 then
begin
Form1.Canvas.MoveTo(xt, yt);
Form1.Canvas.LineTo(xl, yl);
Form1.Canvas.MoveTo(xt, yt);
Form1.Canvas.LineTo(xr, yr);
end;
xt := x;
yt := y;
if x > xs then
begin
xl := trunc(x + Len * Cos(pi - ArcTan((y - ys) / (x - xs)) + Pi / 6));
yl := trunc(y - Len * Sin(pi - ArcTan((y - ys) / (x - xs)) + Pi / 6));
xr := trunc(x + Len * Cos(pi - ArcTan((y - ys) / (x - xs)) - Pi / 6));
yr := trunc(y - Len * Sin(pi - ArcTan((y - ys) / (x - xs)) - Pi / 6));
Form1.Canvas.MoveTo(x, y);
Form1.Canvas.LineTo(xl, yl);
Form1.Canvas.MoveTo(x, y);
Form1.Canvas.LineTo(xr, yr);
end
else
if x < xs then
begin
xl := trunc(x - Len * Cos(pi - ArcTan((y - ys) / (x - xs)) + Pi / 6));
yl := trunc(y + Len * Sin(pi - ArcTan((y - ys) / (x - xs)) + Pi / 6));
xr := trunc(x - Len * Cos(pi - ArcTan((y - ys) / (x - xs)) - Pi / 6));
yr := trunc(y + Len * Sin(pi - ArcTan((y - ys) / (x - xs)) - Pi / 6));
Form1.Canvas.MoveTo(x, y);
Form1.Canvas.LineTo(xl, yl);
Form1.Canvas.MoveTo(x, y);
Form1.Canvas.LineTo(xr, yr);
end
else
if y < ys then
begin
xl := trunc(x + Len * Sin(Pi / 6));
yl := trunc(y + Len * Cos(Pi / 6));
xr := trunc(x - Len * Sin(Pi / 6));
yr := trunc(y + Len * Cos(Pi / 6));
Form1.Canvas.MoveTo(x, y);
Form1.Canvas.LineTo(xl, yl);
Form1.Canvas.MoveTo(x, y);
Form1.Canvas.LineTo(xr, yr);
end
else
begin
xl := trunc(x + Len * Sin(Pi / 6));
yl := trunc(y - Len * Cos(Pi / 6));
xr := trunc(x - Len * Sin(Pi / 6));
yr := trunc(y - Len * Cos(Pi / 6));
Form1.Canvas.MoveTo(x, y);
Form1.Canvas.LineTo(xl, yl);
Form1.Canvas.MoveTo(x, y);
Form1.Canvas.LineTo(xr, yr);
end;
end;
end;procedure TForm1.FormShow(Sender: TObject);
begin
Form1.Color := clWhite;
xt := -1;
yt := -1;
xl := -1;
yl := -1;
xr := -1;
yr := -1;
end;end.
//////////////////////////////////////////////////////////
新建一个Application,上面的代码Copy一下,在属性框中下来设置好Form1的事件,然后Run就可以看到效果
楼主如果想要填充的三角箭头很难,Delphi中只能填充长方形,填充三角形必须自己写代码,通过画点来实现填充,这是计算机图形学里面的东东,很麻烦的。
///////////////////////////////////////////////////
对了,楼主,是不是加点分,为你的这个问题写了两个小时的代码,要不就把这个贴加FAGQ中去,让我好涨点信誉分,觉得信誉分太少了。