求画线控件(200分)

  • 主题发起人 cccccccs
  • 开始时间
C

cccccccs

Unregistered / Unconfirmed
GUEST, unregistred user!
就是给出两个点的坐标画线。。。。
要求:
1:可以变色
2:可以改变线的宽度
3:不要做成那种矩形、只显示对角线的那种,那样会盖住下面的控件的。
上面三个应该比较容易一点
4:可以写标签,就是写描述信息了,描述信息放在线上,并且与线平行,就是说,当线为斜线时,描述信息也要是斜的。。。这样就不能只加个label了事。。

各位大佬指点一下吧。。。拜。。。
 
用画笔 form1.canvas
 
因为还要对它进行各种操作,并且在一个form可能会应用很多线,只用canvas画显然是不合适的啊
 
要配合上放这个线控件的容器才比较好处理.
 
可以用鼠标在Form画线,并可复制绘制的线,可选中并删除某一条线,功能不多,希望对有意学习矢量图程序编程的朋友有一个引导的作用。
http://www.aidelphi.com/6to23/docu/Vector.zip
 
http://tgdjw.nease.net
不过是vc做的
或看看
http://www.efg2.com/Lab/Graphics/LineStretch.htm
 
重要的不是前3个功能,而是第4个,就是标签那个。。。这才是我头疼的亚。。。
 
http://www.csdn.net/dev/Delphi/ 里看看
 
use api,the 4th param of createfont nOrientation is the angle,select this font then you can use textout to draw
 
to weiwei81123
您详细说一下哪个api可以吗。。谢谢
 
CreateFont/CreateFontIndirect
SelectObject
TextOut
DeleteObject
 
同意 weiwei81123的方法。
 
做了一下,发现效果不是很好。。。因为线和标签的坐标、位置都需要很精确,差一点就看上去很糟糕。。而线一般都是用SetWindowRgn之类的画,坐标稍有偏差,角度也不那么精确。。所以表现出来就很差。。。
再者,label总是在线下面,因为继承TGraphicControl的缘故,看上去很不爽,而继承twincontrol的话又会盖住其他控件,因为尽管它是斜的label,毕竟还是个矩形。。。真伤脑筋啊。。。
我承认我废材。。。请问哪有类似比较好的控件可以参考啊。。。拜、、、分数可以再加的。。555
 
哈,楼主有意思.
我去试试看.
 
你用控件放到窗体上,我个人认为不合适,我刚做了一个类似的软件,我认为,你可以看看app2001提供的那个程序,像那个程序一样,你定义你自己的图形的一些属性,然后在Form或者PaintBox等容器上画出你需要的东西。
用控件,窗口会很闪,而且不容以透明。

关于你说的座标需要很精确的问题,很遗憾,我也碰到了,而且没有很好的解决,我用的方法是使用三角函数,因为它们的精度比较高,能尽量减少误差,另外,还可以用些“骗术”,比如按下Shift时,直接画直线、竖线等。
 
我想知道,那个描述信息的字是总是向上的吧。也就是不会有倒“福”那样的情况
吧。那就根据坐标一个个字的输出吧。根据直线的斜率,坐标确定信息的位置。输出
一个字,改一下坐标。这样行吗?
 
我这有一个类似windows画板的例子,需要的话,把你的邮箱留下!
 
我的邮箱cccccccs@263.net

尽管看上去很古怪的邮箱,但是是我最常用的。。。多谢多谢。。拜
 
试试如下代码。(来自tqz)
并非所有的字体都可以旋转。(TrueType 字体都可旋转)。
procedure AngleTextOut(CV: TCanvas
const sText: String
x, y, angle:integer);
var
LogFont: TLogFont;
SaveFont: TFont;
begin
SaveFont := TFont.Create;
SaveFont.Assign(CV.Font);
GetObject(SaveFont.Handle, sizeof(TLogFont), @LogFont);
with LogFont do
begin
lfEscapement := angle*10
lfPitchAndFamily := FIXED_PITCH or FF_DONTCARE;
end
{with}
CV.Font.Handle := CreateFontIndirect(LogFont);
SetBkMode(CV.Handle, TRANSPARENT);
CV.TextOut(x, y, sText);
CV.Font.Assign(SaveFont);
SaveFont.Free;
end;

procedure TForm1.TrackBar1Change(Sender: TObject);
begin
Refresh;
AngleTextOut(Canvas,'abc',20,30,TrackBar1.Position);
end;
 
用AddFlow
 
顶部