清囊而出!有关Line!(235分)

  • 主题发起人 主题发起人 Look
  • 开始时间 开始时间
L

Look

Unregistered / Unconfirmed
GUEST, unregistred user!
本人在开发系统时,需要Line控件,主要时斜线,要求可以拖拉,
用过Vb5.0的Line吧(当然vb不能拖拉),希望能有此东西!
 
从TCustomGraphic控件继承,响应OnMouseMove事件,我做一个再通知你,
分数先别给别人。
 

代码在此,你所说的“拖拉”是在编辑状态还是在运行状态?如果是在运行
状态那么我的代码还要改。不过肯定没有问题,我帮你做,主要是看上了你那分
数,不要给别人,我好久都没有进分了。
*_^
unit GraphicControl1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
type
TGraphicControl1 = class(TGraphicControl)
private
{ Private declarations }
protected
{ Protected declarations }
public
{ Public declarations }
constructor Create(AOwner : TComponent);
destructor Destroy;override;
procedure Paint;override;
published
{ Published declarations }
end;

procedure Register;
implementation
procedure Register;
begin
RegisterComponents('MyControl', [TGraphicControl1]);
end;

constructor TGraphicControl1.Create(AOwner : TComponent);
begin
inherited Create(AOwner);
Width :=50;
Height := 50;
end;

destructor TGraphicControl1.Destroy;
begin
inherited Destroy;
end;

procedure TGraphicControl1.Paint;
begin
inherited Paint;
With Canvasdo
begin
MoveTo(0,0);
LineTo(Width,Height);
end;
end;

end.
 
吕雪松的答案太简单了吧?
拖拉的要求我估计不光是移动整跟线, 而且有在两端拖拉可以改变长度和整个线的倾斜度.
你的控件如果要实用可有的改了.
另外还要考虑针对斜线,client区域不能是rect, 而必须是region哦(是啊, 在明明离
开这跟线十万八千里的地方点一下鼠标倒激活了这跟线的操作, 感觉上总也说不过去的)
另外还有线的粗细, 颜色, 形式, 3D.....等等.
论我的经验, 做这个控件比通过程序在parent.canvas上直接控制还要复杂.
 
自己做一个吧, 不是很难.
此外, 你要的拖拉功能是要拖拉整个直线还是线的顶点呢? 如果要拖拉顶点, 可以添
加两个属性, 每次顶点坐标改变则重新 paint. 全部声明如下(implementation 待续):
TLine=Class(TGraphicControl)
private
fAngle: integer;
fLength: integer;
fDirection: char;
function GetAngle: integer;
function GetLength: integer;
function GetStartPoint: tpoint;
function GetEndPoint: tpoint;
procedure SetDirection(value: char);
procedure SetAngle(value: integer);
procedure SetEndPoint(value: tpoint);
procedure SetStartPoint(value: tpoint);
protected
procedure paint;
public
constructor Create(AOwner: TComponent);
override;
procedure Invalidate;
override;
property StartPoint: tpoint read GetStartPoint write SetStartPoint;
property EndPoint: tpoint read GetEndPoint write SetEndPoint;
published
property Angle: integer read GetAngle write SetAngle;
//长度不变, 方向改变
property Length: integer read GetLength write SetLength;
//方向不变, 长度改变
property Direction: char read fDirection write SetDirection;
//横竖撇捺四个方向
property OnClick;
property OnDblClick;
property OnDragDrop;
property OnDragOver;
property OnEndDrag;
property OnMouseDown;
property OnMouseMove;
property OnMouseUp;
end;
 
很小一点改进意见:
TLine=Class(TCustomControl)
......
public
......
procedure CreateParams(var Params: TCreateParams);override;
......
end;
 
要是这么容易我也不清囊而出。(看来大家没有用过vb5.0,毕竟delphi要好与vb)
我查了许多书和vcl的源代码,不知道delphi的那八个小点如何做出的(控件周围的),我希望向vb一样,在设计阶段改变它,让它在Line控件周围(不是一个方框,而是根据Line的形状来包围Line).
还有在运行阶段如果有两个Line是否相互遮盖?
我主要用途是分析化学,用户要求用直观的方式来调整Line(以前用Tedit),然后
根据调整来计算Line的准确坐标!用用户的话说是揪住Line两头顺便动!!!
不用其他控件的原因是他要求界面他可以改,但不修改源代码!!!
 
关于8个点,应该如Huizhang所言
可以看一下Delphi By delphi吧!
 
VB的画图功能确实很有特性, 比Delphi的好. 主要的缺别试OnClick, Delphi判断鼠
标击在控件的矩形内即为Click了,而VB必须击在线上.
那八个小点可不简单呦, 学名叫做GrabHandle, 没一个都是一个单独的Component,
是在TFormDesigner(D3)/iFormDesigner中定义的.
Look兄别着急, 我在明天8点之前一定给你搞定.
 
如果你不想自己做的话,可以用Cadsys32控件,在问题检索中找.
不建议,当我没说过。:-)
 
TLine已经搞定, 就是这两天上不来, 无法贴上来. 我把他放到我校的FTP上了, 自己
去取吧, <a hreh="ftp://ftp.hrbucea.edu.cn/incoming/delphi/tline.zip">TLine.zip</a>.
关于TLine:
1. 完全由坐标控制, 改变坐标后自动改变BoundsRect, 相关属性:
published:
StartX, StartY -- 起点XY
EndX, EndY -- 终点XY
public:
StartP, EndP -- 起点, 终点
MidP -- 中分点(只读)
2. 几何属性:
angle -- 角度(顺时针为正), 改变角度后长度不变终点改变
Distance -- 长度, 改变长度角度不变终点改变
Corner -- 所在象限(只读) 3 | 4
---+---
2 | 1
weight -- 线宽
3. 带箭头, 相关属性:
Arrow -- 可以设置成 laNone, laStart, laEnd, laBoth
ArrowWidth -- 箭头宽度, 是线宽的倍数
ArrowLength -- 箭头长度, 是半个箭头宽度倍数
GrabHandle在Delphi by Delphi中的TProxyForm中有源码
直线的拾取问题正在做, 目标是: 鼠标击在线上才做对Click反应, 否则发出MouseMessage
给它的Parent, 使鼠标有穿透能力
 
佩服佩服,不愧是图像专业!
 
厉害厉害,佩服佩服
 
>拾取问题正在做, 目标是: 鼠标击在线上才做对Click反应, 否则发出MouseMessage
>给它的Parent, 使鼠标有穿透能力
可以响应WM_HITTEST消息,如果result:=HT_NOWHERE的话,鼠标事件就自动穿透了。
 
to huizhang:
那个ZIP只是兰色不能DOWN?
 
我帮huizhang兄, 更正一下:
download :<a href="ftp://ftp.hrbucea.edu.cn/incoming/delphi/tline.zip">TLine.zip</a>
 
顺便咱也提俩问题(需要的话,我可以另行加分):
1,delphi by delphi 什么的干活?那有?
2,tline.zip z只能在编辑状态下使用,如何是他在运行时,也
具有相同的效果?
 
从副一次:答案接受既赠100¥
 
to SeaSky: thanks for crect the link error.
to tqz: many thanks
to yaojaqing: Delphi by Delphi is a visual programing package simulating
Delphi write purely by Delphi.
<a href="/delphi/attachments/handel.zip">Delphi by Delphi带源码可供下载</a>
 
to yaojiaqing:
>2,tline.zip 只能在编辑状态下使用,如何是他在运行时,也具有相同的效果?
此控件的特点就是在运行时可以用StartX,StartY,StartP,EndX,EndY,EndP等属性
来控制直线的端点, 也可以使用angle,Distance属性控制终点位置.
当然, 也保留了Delphi的Left,Top,Width,Height改变边界. 但是直线的端点可不在
边界上, 这是因为要考虑直线的宽度,箭头宽度.
 

Similar threads

D
回复
0
查看
802
DelphiTeacher的专栏
D
D
回复
0
查看
747
DelphiTeacher的专栏
D
D
回复
0
查看
696
DelphiTeacher的专栏
D
D
回复
0
查看
767
DelphiTeacher的专栏
D
D
回复
0
查看
809
DelphiTeacher的专栏
D
后退
顶部