ListView模拟的简单流程图界面

昨天花了点时间以ListView为基础,为各ListItem添加了连接箭头,模拟出一个简单的流程图界面,拖动图标时亦会调整重绘连线。
重点在绘箭头连接线用的DrawFlowLine函数上,有需要的朋友可自己扩展一下:
  1. //CommCtrl, GraphUtil
  2. procedure DrawFlowLine(ACanvas: TCanvas; SrcItem, DestItem: TListItem);
  3. var
  4.     SrcPt, DestPt: TPoint;
  5.     SrcRect, DestRect: TRect;
  6.     ArrowDirect: TScrollDirection;
  7. begin
  8.     //取对象的中点供比较之用
  9.     ListView_GetItemRect(SrcItem.ListView.Handle, SrcItem.Index, SrcRect, 0);
  10.     ListView_GetItemRect(DestItem.ListView.Handle, DestItem.Index, DestRect, 0);
  11.     SrcPt.X := SrcRect.Left + (SrcRect.Right - SrcRect.Left) div 2;
  12.     SrcPt.Y := SrcRect.Top + (SrcRect.Bottom - SrcRect.Top) div 2;
  13.     DestPt.X := DestRect.Left + (DestRect.Right - DestRect.Left) div 2;
  14.     DestPt.Y := DestRect.Top + (DestRect.Bottom - DestRect.Top) div 2;
  15.     //通过中点的比较决定箭头方向
  16.     if Abs(SrcPt.X - DestPt.X) > Abs(SrcPt.Y - DestPt.Y) then begin
  17.         if SrcPt.X <= DestPt.X then ArrowDirect := sdRight
  18.         else ArrowDirect := sdLeft;
  19.     end else begin
  20.         if SrcPt.Y <= DestPt.Y then ArrowDirect := sdDown
  21.         else ArrowDirect := sdUp;
  22.     end;
  23.     //计算线段的起点与终点
  24.     case ArrowDirect of
  25.         sdLeft: begin
  26.             SrcPt := Point(DestRect.Right-16, DestRect.Top + ((DestRect.Bottom-DestRect.Top) div 2));
  27.             DestPt := Point(SrcRect.Left+16, SrcRect.Top + ((SrcRect.Bottom-SrcRect.Top) div 2));
  28.         end;
  29.         sdRight: begin
  30.             SrcPt := Point(SrcRect.Right-16, SrcRect.Top + ((SrcRect.Bottom-SrcRect.Top) div 2));
  31.             DestPt := Point(DestRect.Left+16, DestRect.Top + ((DestRect.Bottom-DestRect.Top) div 2));
  32.         end;
  33.         sdUp: begin
  34.             SrcPt := Point(DestRect.Left + ((DestRect.Right-DestRect.Left) div 2), DestRect.Bottom+2);
  35.             DestPt := Point(SrcRect.Left + ((SrcRect.Right-SrcRect.Left) div 2), SrcRect.Top);
  36.         end;
  37.         sdDown: begin
  38.             SrcPt := Point(SrcRect.Left + ((SrcRect.Right-SrcRect.Left) div 2), SrcRect.Bottom);
  39.             DestPt := Point(DestRect.Left + ((DestRect.Right-DestRect.Left) div 2), DestRect.Top);
  40.         end;
  41.     end;
  42.     //绘制连线
  43.     ACanvas.Pen.Width := 2;
  44.     case ArrowDirect of
  45.         sdLeft, sdRight: begin
  46.             ACanvas.MoveTo(SrcPt.X, SrcPt.Y);
  47.             ACanvas.LineTo(SrcPt.X + 8, SrcPt.Y);
  48.             ACanvas.LineTo(DestPt.X - 8, DestPt.Y);
  49.             ACanvas.LineTo(DestPt.X , DestPt.Y);
  50.         end;
  51.         sdUp, sdDown: begin
  52.             ACanvas.MoveTo(SrcPt.X, SrcPt.Y);
  53.             ACanvas.LineTo(SrcPt.X, SrcPt.Y + 8);
  54.             ACanvas.LineTo(DestPt.X, DestPt.Y - 8);
  55.             ACanvas.LineTo(DestPt.X, DestPt.Y - 2);
  56.         end;
  57.     end;
  58.     //绘制箭头
  59.     case ArrowDirect of
  60.         sdLeft: DrawArrow(ACanvas, sdLeft, Point(SrcPt.X - 2, SrcPt.Y - 5), 4);
  61.         sdRight: DrawArrow(ACanvas, sdRight, Point(DestPt.X - 2, DestPt.Y - 5), 4);
  62.         sdUp: DrawArrow(ACanvas, sdUp, Point(SrcPt.X - 5, SrcPt.Y-2), 4);
  63.         sdDown: DrawArrow(ACanvas, sdDown, Point(DestPt.X - 5, DestPt.Y - 4), 4);
  64.     end;
  65. end;



完整的程序已上传到我的资源中: http://download.csdn.net/source/758098

<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值