有可选择的标签控件吗?

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 处理程序更新了这个问题,它确实使它透明,但它有不需要的副作用(或不够)。

以上是关于有可选择的标签控件吗?的主要内容,如果未能解决你的问题,请参考以下文章

标签选择器控件

选择本地文件上传控件 input标签

隐藏输入/选择时,表单字段标签不会隐藏

QT5-控件-QFontComboBox-字体选择下拉列表,使用一个标签查看效果

dropdownlist控件下有的项不允许选择可以吗?

如何根据驻留在 updatePanel 中的 DataGrid 中所做的行选择来更新控件 [DataGrid、TextBoxes 和标签]?