有可选择的标签控件吗?
Posted
技术标签:
【中文标题】有可选择的标签控件吗?【英文标题】:Is there a selectable label control? 【发布时间】:2011-03-21 17:00:40 【问题描述】:我想要一个可选择的标签控件,就像屏幕截图中的那个。可以使用无边框 TEdit 完成,但我想知道是否有其他方法可以处理渐变背景?
example http://usera.ImageCave.com/brk303/SelectableLabel.png.jpg
为了澄清,我使用的是一个简单的 PageControl,由于 Win XP 有渐变绘图,放置在页面上的无边框 TEdit 不能完美地融合:
Edit on a PageControl http://usera.ImageCave.com/brk303/Gradient.png.jpg
更新:
我设法通过添加到达了一半
procedure CNCtlColorStatic(var AMsg: TWMCtlColorStatic); message CN_CTLCOLORSTATIC;
procedure TTransparentEdit.CNCtlColorStatic(var AMsg: TWMCtlColorStatic);
begin
with ThemeServices do
if ThemesEnabled then
begin
SetBkMode(AMsg.ChildDC, Windows.TRANSPARENT);
DrawParentBackground(Handle, AMsg.ChildDC, nil, False);
AMsg.Result := GetStockObject(NULL_BRUSH);
end
else
inherited;
end;
它现在是透明的,但需要做其他事情,因为在选择文本时绘画无法正常工作。这种行为很难解释,我会进一步调查并在这里更新......
【问题讨论】:
Windows 对话框中显示的控件实际上只是一个普通的编辑控件。为了在您的程序中获得相同的效果,我认为这只是在编辑控件和页面控件上正确配置的问题。另外,对我来说,短语“简单的 PageControl”意味着您使用了 Delphi 提供的 TPageControl 类,但这不是您在图片中显示的内容。 是的,我还怀疑 Windows 对话框使用了普通的编辑控件,但它的背景恰好是单色的,所以可以。我使用的 DevEx TabControl 的行为方式与 Delphi TPageControl 相同,因此没有区别。至于“只是在编辑控件和页面控件上正确配置的问题”,我认为这是不可能的,因此提出了这个问题。 Windows XP 对话框使用渐变,并且这些对话框上的“可选标签”(编辑控件)正确显示渐变,即使在聚焦时也是如此。所以,这是可能的。 【参考方案1】:正常的方法是使用无边界 (BorderStyle := bsNone
) 和只读 (ReadOnly := true
) TEdit
,可能与 Color := clBtnFace
结合使用,如您所说。但是,渐变背景并不常见,并且没有开箱即用的支持。不过,自己动手也不是太难。我会尝试在几分钟内找到一个简单的解决方案。
更新
在 Windows 编辑框中绘图并非易事。你确定你需要渐变背景吗?您当然可以编写自己的控件——编写类似 TEdit 的控件并不难。我已经这样做了几次。 (Proof)
更新 2
我自己没有尝试过,它可能不适用于视觉主题,但您可以尝试创建一个透明的 `TEdit` 控件:http://www.delphi3000.com/articles/article_935.asp?SK=现在我试了一下,在带有 Aero 的 Windows 7 下根本无法使用。
【讨论】:
您提供的链接中的类确实是完全透明的(至少在 XP 中),但只有当它没有聚焦时,一旦您聚焦,背景就会被绘制成单一颜色,但我会调查来源,也许我能弄清楚,谢谢 @dmauric.mp:很好,但要小心:您的一些最终用户可能正在运行 Windows Vista 或 Windows 7,他们可能不太高兴... 我修改了代码,使其在聚焦时也是透明的。我也在 Xp、Vista 和 W7 (Aero) 中尝试过它,它似乎在所有这些中都有效,请解释一下你遇到了什么问题? @dmauric.mp:愿意分享您的修改吗? @Marjan Venema:不会影响 W7 操作的,它只是 Ftransparent := false;在我删除的 DoEnter 中。但仔细检查后,我意识到它并没有真正起作用,我只是第一次没有注意到......抱歉造成混乱【参考方案2】:标签不可编辑。 TLabel 甚至无法接收焦点,因为它不继承自 TWinControl。
我会使用 TEdit 来模仿您的屏幕截图:
object Edit1: TEdit
BorderStyle = bsNone
ParentColor = True
ReadOnly = True
Text = 'Editable label'
end
(您可以将上述代码复制并粘贴到您的表单中)
【讨论】:
你试过渐变背景吗?在我的 D2009 中,编辑使用 ParentColor,但 Parent 的 Color 属性只是其渐变颜色之一。 (使用 TMS Software 的 TAdvPanel 作为编辑的背景)。所以编辑仍然以纯色显示。 设置ParentBackground = True
告诉控件使用其父级的主题背景。 ParentColor
在父级甚至不使用其颜色时无关紧要。
@Rob Kennedy:TEdit 没有 ParentBackground 属性。对于其他控件,它在 ControlStyle 中实现为 csParentBackground,但这不足以让 TEdit 变得透明
ParentBackground 在 TEdit 中受到保护。
是的,它在 TWinControl 中是向上的,但是将 ParentBackground 设置为 true(IOW 将 csParentBackground 添加到 ControlStyle)不会使 TEdit 透明。我用 CN_CTLCOLORSTATIC 处理程序更新了这个问题,它确实使它透明,但它有不需要的副作用(或不够)。以上是关于有可选择的标签控件吗?的主要内容,如果未能解决你的问题,请参考以下文章
QT5-控件-QFontComboBox-字体选择下拉列表,使用一个标签查看效果
如何根据驻留在 updatePanel 中的 DataGrid 中所做的行选择来更新控件 [DataGrid、TextBoxes 和标签]?