请看一下这个截图
替代文字 http://www.maclife.com/files/u18/Yep3-big.jpg
我认为这些是这种“标签面板”的主要特点:
1)面板上的每个标签都是一个独立的控件,可以点击
2)当没有足够的空间显示当前行中的下一个标签时自动换行。
3) 每个标签的圆角矩形边框是一个不错的功能。
我想在 Delphi 中实现类似的功能,是否有现有的控件可以做到这一点?如果不是,那么实施这种控制的最佳方式是什么?
谢谢你。
请看一下这个截图
替代文字 http://www.maclife.com/files/u18/Yep3-big.jpg
我认为这些是这种“标签面板”的主要特点:
1)面板上的每个标签都是一个独立的控件,可以点击
2)当没有足够的空间显示当前行中的下一个标签时自动换行。
3) 每个标签的圆角矩形边框是一个不错的功能。
我想在 Delphi 中实现类似的功能,是否有现有的控件可以做到这一点?如果不是,那么实施这种控制的最佳方式是什么?
谢谢你。
当您使用最新的 Delphi 版本时,请使用 TFlowPanel 和一些适当的标签控件。一个简单的 TButton 或 TLinkLabel 应该可以做到这一点。
每个可点击标签不一定必须是它自己的控件。它必须是您可以检测到被点击的区域。
假设您将每个区域表示为一个Windows 区域。TCanvas.TextExtent
您可以使用该功能根据其文本确定每个应有多大的宽度。然后创建一个具有类似功能的区域CreateRectRgn
。对于圆角,请尝试CreateRoundRectRgn
。PtInRegion
您可以使用该函数测试每个区域中的鼠标事件。您可以使用 绘制它们周围的边框FrameRgn
。最后一个障碍是将它们绘制在屏幕上,以便它们都适合。您正在创建区域并且知道它们的宽度,因此将标签分配到一行,直到空间不足,然后开始下一行。
在 Delphi 7 中自定义对齐有两种可能的解决方案。您可以通过从 TCustomPanel 派生并覆盖 AlignControls( ) 方法来制作自己的流程面板,或者您可以将对齐设置为 alCustom 并处理 OnAlignPosition 事件。
我想我会选择 TCustomPanel-derivative 选项。Delphi 2007 表格中的 TFlowPanel 使用该选项 - 但我必须承认,我从未尝试过我自己......