怎么样在image上画菱形呢(100分)

  • 主题发起人 主题发起人 潮州人
  • 开始时间 开始时间

潮州人

Unregistered / Unconfirmed
GUEST, unregistred user!
大家好,我看了一些画图的源代码,都是通过 user Graphics 单元来画的,但就是没有能画菱形的代码,有画直线、矩形、圆矩形、随圆,各位通知要画菱形应该怎么样做呢?
例如这个是画矩形的。
Image.Canvas.Rectangle(TopLeft.X, TopLeft.Y, BottomRight.X, BottomRight.Y)
那画菱形应该怎么样写呢?
 
自己写个喽,画4条直线[:)]
 
uiit 我就是不会呀,能不能写给我?
 
偶不是来抢分滴[8D]
 
没人答,我试试
procedure TForm1.BitBtn1Click(Sender: TObject);
var
dw, dh: Integer;
begin
dw := Image1.Width;
dh := Image1.Height;
//DrawDiamond
Image1.Canvas.MoveTo(dw div 2, 0);
Image1.Canvas.LineTo(0, dh div 2);
Image1.Canvas.LineTo(dw div 2, dh);
Image1.Canvas.LineTo(dw, dh div 2);
Image1.Canvas.LineTo(dw div 2, 0);
end;
 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
function drawdown(x1,y1,a,b:integer;cs:Tcanvas):boolean;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
self.drawdown(100,100,5,10,form1.Canvas);
end;
{画菱形的函数,x1,y1为菱形的中心点,a,b为轴长,cs为图板}
function TForm1.drawdown(x1,y1, a, b: integer; cs: Tcanvas): boolean;
var
i:integer;
t1,t2,t3,t4:Tpoint;//依次生成菱形的四个定点
begin
try
t1.X:=x1-a;
t1.Y:=y1;
t2.X:=x1;
t2.Y:=y1-b;
t3.X:=x1+a;
t3.Y:=y1;
t4.X:=x1;
t4.Y:=y1+b;
cs.MoveTo(t1.X,t1.Y);
cs.LineTo(t2.X,t2.y);
cs.LineTo(t3.X,t3.y);
cs.LineTo(t4.X,t4.y);
cs.LineTo(t1.X,t1.Y);
except
{出错处理}
result:=false;
end;
result:=true;
end;

end.
//==============================
复制以上,form上放置1 button即可
嘿嘿,蹭点分,看看可以用不
顺便bs楼上的,那么多分了还抢[8D][:(!][:(!]
 
呵呵,俺说是4条直线,没必要moveto,lineto的啦
procedure TCanvas.Polyline(const Points: array of TPoint);
begin
Changing;
RequiredState([csHandleValid, csPenValid, csBrushValid]);
Windows.Polyline(FHandle, PPoints(@Points)^, High(Points) + 1);
Changed;
end;
这个函数就可以用的啦,好像多边形那个也可以,只要你取好点
 
顺便bs楼上的,那么多分了还抢?[:(!][:D]

拜托,偶是看了好久,的确没人回复偶才写了几句滴。你运气背啦,晚了一点点。再说,还有UIIT,在下面呢。呵呵
 
[:D]呵呵,俺想楼主肯定会,也许一时转不过弯了,所以提个醒啦!
没注意到还有下文....
嘿!楼上,不能上q灌了[8D]哈哈
 
今天心情好,嘻嘻,代码注解一下UIIT的回复
procedure TForm1.Button1Click(Sender: TObject);
var
dw, dh: Integer;
begin
dw := Image1.Width;
dh := Image1.Height;
//DrawDiamond
Image1.Canvas.Polyline([Point(dw div 2,0),Point(0,dh div 2),Point(dw div 2,dh),Point(dw,dh div 2),Point(dw div 2,0)]);
end;

效果一样,其实画什么都无所谓,只要你凑齐坐标和路线
 
是呵,上qq时间有严格限制,bbs没人管,偶就在这灌![:D][:D]
 
[:(]俺是心情不好,才上来灌
 
郁闷啥呢?找工作还是解决问题啊?要解决问题到飞刀老大那儿应该就不是问题了吧。呵呵
工作的事,毕竟还要看机缘滴,越急越吃亏。看好以后的路再走嘛
 
多谢各位的帮助,有空请大家喝工夫茶,几个代码我都测试了,可以画菱形,但不能拉大小呀,我要的功能是能实现像画矩形一样,根据一个点,来拉大小呀,还要各位来帮忙呀,分一定不会少给大家的。
 
像画矩形一样,根据一个点,来拉大小 ???搞什么?你画个矩形我瞧瞧。怎么样拉大小啊

你说的是要作类似画图对象,线段图形对象的东西,那就不是一句两句能说清了。
要根据鼠标的操作,实时清除原线段,绘出新线段,判断鼠标位置,标记可拖拉点。等等。是这样吗? 噢。慢慢试试吧。
 
to shangshang:
呵呵,当然不是解决问题了,谢谢啦,也没什么
to 楼主:
正如俺当初估计的一样拉,你的问题不是画菱形的问题了,即使是矩形也要通过
判断鼠标消息,重绘...还好Delphi有MouseMoveDown/up..鼠标事件了,在里面重绘
可以了!省得你去对WM_LBUTTONUP等消息去处理了。
 
to shangshang 可能是我开始还没有说清楚,我要实现的就是像windows中画图那样画矩形方式,来画菱形,应该就是你上面说的,能不能详细的给我说一下?
 
to unit 你有上QQ吗,我的QQ是8622052 对于这个问题,我还要再请教你。
 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
t1,t2,t3,t4:Tpoint;//
x1,y1,a,b:integer; //作为全局变量放在这里,如果你想做成空间的话
function drawdown(x1,y1,a,b:integer;cs:Tcanvas):boolean;
function newdown(x2,y2,a2,b2:integer;cs:Tcanvas):boolean;
end;

var
Form1: TForm1;

implementation
var
dragflag:boolean; //托动标志,如果做成空间,也要放在上边才好
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
x1:=100;
y1:=100;
a:=10;
b:=50;
self.Canvas.Pen.Color:=clblack;
self.drawdown(x1,y1,a,b,form1.Canvas);
end;

function TForm1.drawdown(x1,y1, a, b: integer; cs: Tcanvas): boolean;
var
i:integer;
begin
try
t1.X:=x1-a;
t1.Y:=y1;
t2.X:=x1;
t2.Y:=y1-b;
t3.X:=x1+a;
t3.Y:=y1;
t4.X:=x1;
t4.Y:=y1+b;
cs.MoveTo(t1.X,t1.Y);
cs.LineTo(t2.X,t2.y);
cs.LineTo(t3.X,t3.y);
cs.LineTo(t4.X,t4.y);
cs.LineTo(t1.X,t1.Y);
except
{出错处理}
result:=false;
end;
result:=true;
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if ((x>=t1.X-5) or (x <t1.X+5) ) and ((y>=t1.y-5) or (y<t1.Y+5)) then
begin
dragflag:=true;
exit;
end;

end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
dragflag:=false;
end;




function TForm1.newdown(x2, y2, a2, b2: integer; cs: Tcanvas): boolean;
begin
self.Canvas.Pen.Mode:=pmnotxor;//这里擦出模式没选好,忘了
self.drawdown(x2,y2,a2,b2,form1.Canvas);//擦出模式
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if dragflag then //假如是托动的话
begin
self.newdown(x1,y1,a,b,self.Canvas);//擦出
self.Canvas.Pen.Mode:=pmBlack; //标定画笔模式
self.drawdown(x1,y1,x1-x,b,self.Canvas); //重新划入菱形
a:=x1-x; //更改全局变量,方便下次擦出
end;
end;
end.
//=========
form上1个按钮,代码copy过去
这就是个力气活,如果做成空间需要接受鼠标消息。
我这里直接就用form的鼠标方法了,
这个例子,只能托动菱形左边的t1点,
剩下的点同理可得。
 
偶不是来抢分滴[:D][:D]
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
613
import
I
I
回复
0
查看
637
import
I
后退
顶部