huizhang最新更新TLine, 运行时只要鼠标一击, 连"拖"带"拉"(200分)

  • 主题发起人 主题发起人 yysun
  • 开始时间 开始时间
Y

yysun

Unregistered / Unconfirmed
GUEST, unregistred user!
Tline 加了两个属性:
ShowHangle:Runtime property。设置成True后,显示三个GrabHandle
起点,终点的用来拉伸,中间点的那个用来拖着走。
AutoShowHandle:默认为True。只要设置为True,运行时即可拉伸。
下载地址不变:
ftp://ftp.hrbucea.edu.cn/incoming/delphi/tline.zip
or
ftp://ftp.hrbucea.edu.cn/delphi/tline.zip
存在问题:
当它的父控件(Tform)上带有TStatusBar的时候, 拖拉的时候显示的线有问
题, 但是拖拉结果还是正确的.
解决办法: 如果与TStatusBar同时使用, 可以另外放一个Tpanel作为容器,
再把Tline放到Panel上既不会出现上述问题.
 
这里是最新版 <a href=/delphi/attachments/TLine.zip>TLine.zip</a>
谢谢 huizhang。
ps. 还可不可以做成个TPolyline,其中每个点都可以Drag ?
VC中有个例子,可以画矢量图,而不象Delphi中的那个只能做Bitmap.
我们得干掉它 !
 
有人出血我就做, 有了TLine做基础就没什么难度了. 有兴趣的可以自己做一下试一
试, 加一个PointArray, Public property Points[index: integer]: TPoint;
关键在于动态改变边界矩形, 做一个过程检测x,y最大最小值. 画图的时候要将世界
坐标转换成控件的局部坐标. 将那个TLineHandlePosition用顶点的Index替换就差
不多了.
 
huizhang, 我出资 200 好了。
检测 Mouse 是否落在图形上,似乎应该用 hRegion ?
 
哈哈, 老孙, 要你的血就不好意思了. 此类问题属于必做, 我们心爱的Delphi在画图
形上被VB比下去了, 真是心有不甘.
Mouse是否落在图形上本身并不难, 用hRegion或者我以前贴出的点在多边形内的算法
都可以, 难就难在必须对Delphi的内核程序做手术, 光从控件本身下手是不够的. 看
看D妃4的这段源码就清楚了:
function TWinControl.ControlAtPos(const Pos: TPoint;
AllowDisabled: Boolean): TControl;
var
I: Integer;
P: TPoint;
begin
if FControls <> nil then
for I := FControls.Count - 1do
wnto 0do
begin
Result := FControls;
with Resultdo
begin
P := Point(Pos.X - Left, Pos.Y - Top);
if PtInRect(ClientRect, P) and
((csDesigning in ComponentState) and (Visible or
not (csNoDesignVisible in ControlStyle)) or
(Visible and (Enabled or AllowDisabled) and
(Perform(CM_HITTEST, 0, Longint(PointToSmallPoint(P))) <> 0))) then
Exit;
end;
end;
Result := nil;
end;

她可不管你的控件里面用了什么先进的算法, 只是用那个微软USER32.EXE里面提供的
及其弱智的PtInRect函数测试一下. 要做的是, 先检测一下控件本身是否带有PtInRect
方法, 如果有, 使用用户的方法检测, 若无, 弱智就够了.
我现在就开始做这件事, 看看能否不动D妃的内核, 只是在用到我的控件时使用偷梁换
柱的手段给他的parent加一点智慧. 做完了咱们卖给Inprise.
 
我想要的更多!
我没有时间去细看,只看了类的继承关系,只是用了用,觉得不错。
我想知道您是不是用Tcustomcontrol模仿出小点!拖拉时变化线的位置!
 
To Look:
那几个小点--GrabHandle, 每一个都是TCustomControl, 还得有一个List去管理它
们. 每次拖拉的时候, 我都复制了一条TLine, 由于TLine可以用坐标控制, 故将拖拉
的坐标转换成Parent的坐标赋值给Line的相应点就行了, 当MouseUp时, 将原有直线
坐标改变, 删除复制线.
带有穿透能力的线, 过几天就会出台. 好像是有人愿意出血做TPolyLine, 一旦成功,
最先请你试用.
 
huizhang,我有个整容建议可以不用改 ControlAtPos 内核:
1.设立一个 TBaseGraphic 作为基类,定义一个纯虚函数判别是否响应鼠标
TBaseGraphic=class
protected
function ptOnMe(P:TPoint): boolean;
virtual;
abstract;
....
end;

其它矢量图形TLine, TPolyLine, TCircle ...都从此基类派生,
并重载 ptOnMe
2.新制一图形管理构件 TGraphicManager=class(TComponent),
有Active属性和自己的Message Handler.
当Active=true时,
OldonMessage := Application.OnMessage;
Application.OnMessage := HandleMessages;
( 当Active=false时,Application.OnMessage := OldonMessage;)
procedure TGraphicManager.HandleMessages(var Msg : tMsg;
var Handled : Boolean);
begin
case Msg.Message of
WM_LBUTTONDOWN : begin
// FindControl
// if it is decendant of TBaseGraphic then
begin
// if ptOnMe then
begin
// ShowHandle
// Handled = true
// Moving = true
// end
// end
// else
Handled = false
WM_MOUSEMOVE: if Moving then
begin
WM_LBUTTONUP:
end;
end;

这样不知行不行,请多多指教.
 
你的TLine类我很感兴趣。但无法下载。mail一份给我好吧!
请寄到Feixf188@188.net或fxf@infopro.con.cn.(263的信箱就要炸了)多多
多多谢!!!
 
怎么装不上?
[Error] WARNING. Duplicate resource(s):
[Error] Type 2 (BITMAP), ID TLINE:
[Error] File c:/program files/borland/delphi4/Lib/../imports/tline/lines.dcr resource kept;
file ../Imports/TLine/Lines.dcr resource discarded.
 
xixi .
各位说的这些东西我正在做,
以有部分功能实现了。
不过有一个地方不太清楚,如何只Drag 一个点,让图形从画。
to huizhang :
我也同你一样在基类先定义了一个abstract MouseIsInBound的function。
然后在派生类中重载,
如:Rect中好检测。
Ellipse 中就的用到点是否在椭圆中的公式。
Line就得用到点与直线的距离公式。
RoundRect我还没有想好。
 
to huizhang :
TLine控件我拉不下来。
能否给发给我。
thx.
Email:li.zhao@263.net
 
to huizhang :
我以将Tline拉下来了。
不用在给我发了。
thx.
 
to huizhang:
不好意思,您的TLine,使用后,有两个问题:
1. 选中后,拖动改变起始或结束的Grab,按住鼠标不放,用Alt - Tab切换到其他
程序,这时原来的窗口就出现两条线,一条原来的,一条新拖拉出来的。可以在
激活新线,不激活旧线。
2. 拖动中间的Grab移动Line,用Alt - Tab切换到其他程序,这时窗口里的两条
线,都可以被激活了,就想窗口里有两个独立的TLine一样。
 
to redforks: 你说的现象确实存在, 因为我的做法是拖拉的时候复制了一个
TLine,鼠标键起来的时候在释放这个副本。但是不知道为什么当Alt+tab键改变
Focus后,MouseUp事件就不管用了?除非在对FocusChang进行处理,但是我不想再
花功夫了。
To yysun:本问题是yysun出资求作TPolyline的,但是到目前都没有一个理想的结果,实在抱歉。主要遇到下面几个问题:1。想用动态数组存放顶点信息,可是动态
数组在设计时候所赋的值在运行时就丢失了;2。作插值曲线的时候,边界实在不好控
制,拟合曲线当然没问题;3。插入或增加在边界矩形顶点以外的顶点的时候有点困
难;4。需要一个PropertyEditor在设计时使用;5。还需要一个Writer来保存顶点
信息。这几个问题需要集中精力来解决,还需要些时日才能完成。
 
怎么装不上?[Error] WARNING. Duplicate resource(s):
[Error] Type 2 (BITMAP), ID TLINE:
[Error] File c:/program files/borland/delphi4/Lib/../imports/tline/lines.dcr resource kept;
file ../Imports/TLine/Lines.dcr
 
你那个目录下一定有一个同名的资源文件, 且里面没有叫做TLine的Bitmap, 你可以
把我的TLine相关的文件名改一下
 
不好意思打扰,但很想知道Tline和TPolyline的动态。
 
不好意思打扰,但很想知道Tline和TPolyline的动态。
 
对不起各位, TPolyLine一直没有出台, 主要是现在我的主要工作方向在其他的方面,
不能过集中经历来彻底完成他, 另外也觉得单独做一个TPolyLine控件没有必要. 我
现在正在完善我的三维的实数绘图的ViewPort控件, 实质上是一个简单的矢量CAD工
具, 本身具有基本绘图功能, 基本图元(包括PolyLine), 图形数据结构及其存取. 我觉得这样的东西才有点使用价值. 还需要一段时间来完善他, 到时候放到这里让大家
共享. 这个单独的TPolyLine就算了吧.
 

Similar threads

D
回复
0
查看
802
DelphiTeacher的专栏
D
D
回复
0
查看
747
DelphiTeacher的专栏
D
D
回复
0
查看
696
DelphiTeacher的专栏
D
D
回复
0
查看
661
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
后退
顶部