2009-10-12 26 views
5

请看看这张截图在Delphi中实现'标签面板'控件?

alt text http://www.maclife.com/files/u18/Yep3-big.jpg

我觉得这些都是这样的“标签面板”的主要特点:

1)面板上的每个标签是一个独立的控制,并可以被点击

2)当没有足够的空间显示当前行中的下一个标记时自动换行。

3)每个标签的圆角矩形边框是一个不错的功能。

我想在Delphi中实现类似的功能,有没有一个现有的控件来做到这一点?如果没有,那么实施这种控制的最佳方式是什么?

谢谢。

+0

这种'标签面板'的另一个示例:http://www.macgenealogy.org/ images/screen/yep-list.jpg 您可以检查右侧的标签部分。 – 2009-10-12 04:17:47

回答

3

每个可点击标签不一定必须是自己的控件。它只是一个你可以检测到被点击的区域。

假设您将每个区域表示为Windows region。你可以通过TCanvas.TextExtent函数计算出每个文本的宽度。然后创建一个功能如CreateRectRgn的区域。对于圆角,请尝试使用CreateRoundRectRgn。您可以使用PtInRegion函数在每个区域中测试鼠标事件。您可以使用FrameRgn在他们周围绘制边框。最后一个障碍是将它们绘制在屏幕上,以便它们都适合。您正在创建区域并知道它们的宽度,因此将标签分配给一行,直到空间用完,然后开始下一行。

+0

谢谢你的提示Rob。如果我希望这些标签能够通过拖放进行重新定位,您有任何建议吗? 例如,拖动第2行上的第二个标记并放在第1行的开头。 谢谢。 – 2009-10-12 06:01:57

+0

检测鼠标移动和足够的鼠标移动事件来区分拖动和点击,然后调用SetCapture进入“拖动”模式。在等待鼠标事件的同时处理鼠标移动事件,此时您可以重新排列标签。 (这整个问题是一个概述性问题,如果您对任何问题有任何疑问,请发起一个*新问题,人们可以回答,而无需在单个答案中涵盖六种不同的问题。) – 2009-10-12 06:14:29

7

当您在最近的Delphi版本中使用TFlowPanel和一些适当的控件来控制标签。一个简单的TButton或TLinkLabel应该为此做。

+0

感谢Uwe,不幸的是, ,我用D7。升级目前不是一种选择。 – 2009-10-12 06:02:35

1

在Delphi 7中有两种可能的自定义对齐方法。您可以通过派生自TCustomPanel并重写AlignControls()方法来创建自己的流程面板,或者可以将对齐设置为alCustom并处理OnAlignPosition事件。

我想我会去TCustomPanel-derivative选项。 TFlowPanel以Delphi 2007的形式使用该选项 - 但我必须承认,我从来没有尝试过我的自我...

+0

谢谢你的提示,Vegar :) – 2009-10-13 06:31:53