【问题标题】:How to prevent MultiView opacity from affecting children components texts in Delphi?如何防止 MultiView 不透明度影响 Delphi 中的子组件文本?
【发布时间】:2017-12-01 02:24:29
【问题描述】:

我在 Firemonkey 中使用 MultiView 和一些 TButton 按钮。 multiView 在 0.5 时是不透明的,这会导致按钮也是不透明的。

问题:有没有办法防止 MultiView 不透明度影响按钮文本?也就是说,按钮的文本将继续使用明亮的颜色,但按钮的“主体”将是不透明的。我见过一些具有这种视觉功能的应用程序,但我不知道为此目的使用了哪些组件...

【问题讨论】:

  • 也许你在混合opaquetransparent?不透明是实心的,不能被看穿,透明就像窗户里的透明玻璃,你可以透过它看到日光;) 那么,请确认,你希望图标、按钮和按钮文本如何出现?此外,在新图像中,按钮的大小不清楚(可能是两条白线之间的整个区域)?
  • @TomBrunberg,我再次更改了图像以显示我希望如何显示按钮、图标和文本。谢谢。
  • 似乎没有办法以您想要的方式使用TMultiView。您愿意接受其他建议还是特别想坚持使用TMultiView
  • 是的,当然。最初我想到了 MultiView,因为我不知道任何其他选择。有哪些选择可以产生这种效果?
  • 我很快就会发布答案,目前正在编辑中。

标签: delphi firemonkey opacity


【解决方案1】:

使用TRectangle 代替TMultiView 作为菜单的基础。将其Align 设置为左​​侧,将Fill.Color 设置为$7FFFFFFF。前两个十六进制数字 (7F) 定义 Alpha 通道(半透明),其余的十六进制数字 (FFFFFF) 定义 RGB 颜色。这允许您将Opacity 保留为一个,但仍具有半透明效果。 TMultiView 控件无法做到这一点。

对于每个项目,使用TLayoutTImageTText 以及您喜欢的任何分隔线。使用普通的Align 属性来设置项目。

最后,为TLayout 设置HitTest = True,为TImageTText 控件设置HitTest = False。这是为了启用鼠标点击或点击。

以下是我的测试,包括.fmx 内容(已删除图像数据)和快照。

  object Rectangle1: TRectangle
    Align = Left
    Fill.Color = x7FFFFFFF
    Size.Width = 200.000000000000000000
    Size.Height = 210.000000000000000000
    Size.PlatformDefault = False
    object Layout1: TLayout
      Align = Top
      HitTest = True
      Size.Width = 200.000000000000000000
      Size.Height = 50.000000000000000000
      Size.PlatformDefault = False
      TabOrder = 0
      object Image1: TImage
        MultiResBitmap.Height = 128
        MultiResBitmap.Width = 128
        MultiResBitmap = <
          item
            Width = 128
            Height = 128
            PNG = {}
            FileName = 'C:\tmp\Imgs\0.bmp'
          end>
        Align = Left
      end
      object Text4: TText
        Align = Left
        Position.X = 50.000000000000000000
        Size.Width = 151.000000000000000000
        Size.Height = 50.000000000000000000
        Size.PlatformDefault = False
        Text = 'Zero Hero'
        TextSettings.Font.Size = 21.000000000000000000
        TextSettings.Font.StyleExt = {00070000000000000004000000}
        TextSettings.FontColor = claDarkblue
      end
    end
    object Layout2: TLayout
      Align = Top
      HitTest = True
      Position.Y = 50.000000000000000000
      Size.Width = 200.000000000000000000
      Size.Height = 50.000000000000000000
      Size.PlatformDefault = False
      TabOrder = 1
      object Image2: TImage
        MultiResBitmap.Height = 128
        MultiResBitmap.Width = 128
        MultiResBitmap = <
          item
            Width = 128
            Height = 128
            PNG = {}
            FileName = 'C:\tmp\Imgs\1.bmp'
          end>
        Align = Left
      end
      object Text5: TText
        Align = Left
        Position.X = 50.000000000000000000
        Size.Width = 151.000000000000000000
        Size.Height = 50.000000000000000000
        Size.PlatformDefault = False
        Text = 'One More'
        TextSettings.Font.Size = 21.000000000000000000
        TextSettings.Font.StyleExt = {00070000000000000004000000}
        TextSettings.FontColor = claDarkblue
      end
    end
    object Layout3: TLayout
      Align = Top
      HitTest = True
      Position.Y = 100.000000000000000000
      Size.Width = 200.000000000000000000
      Size.Height = 50.000000000000000000
      Size.PlatformDefault = False
      TabOrder = 2
      OnClick = Layout3Click
      OnMouseDown = Layout3MouseDown
      object Image3: TImage
        MultiResBitmap.Height = 128
        MultiResBitmap.Width = 128
        MultiResBitmap = <
          item
            Width = 128
            Height = 128
            PNG = {}
            FileName = 'C:\tmp\Imgs\2.bmp'
          end>
        Align = Left
        HitTest = False
      end
      object Text6: TText
        Align = Left
        HitTest = False
        Position.X = 50.000000000000000000
        Size.Width = 150.000000000000000000
        Size.Height = 50.000000000000000000
        Size.PlatformDefault = False
        Text = 'Double Joy'
        TextSettings.Font.Size = 21.000000000000000000
        TextSettings.Font.StyleExt = {00070000000000000004000000}
        TextSettings.FontColor = claDarkblue
      end
    end
    object Layout4: TLayout
      Align = Top
      HitTest = True
      Position.Y = 150.000000000000000000
      Size.Width = 200.000000000000000000
      Size.Height = 50.000000000000000000
      Size.PlatformDefault = False
      TabOrder = 3
      object Image4: TImage
        MultiResBitmap.Height = 128
        MultiResBitmap.Width = 128
        MultiResBitmap = <
          item
            Width = 128
            Height = 128
            PNG = {}
            FileName = 'C:\tmp\Imgs\3.bmp'
          end>
        Align = Left
        HitTest = False
      end
      object Text1: TText
        Align = Left
        HitTest = False
        Position.X = 50.000000000000000000
        Size.Width = 151.000000000000000000
        Size.Height = 50.000000000000000000
        Size.PlatformDefault = False
        Text = 'Triple Fun'
        TextSettings.Font.Size = 21.000000000000000000
        TextSettings.Font.StyleExt = {00070000000000000004000000}
        TextSettings.FontColor = claDarkblue
      end
    end
  end

【讨论】:

  • 完美!我会测试,但我相信它会适合我的需要。我还将实现项目的动态包含,并强制 TRectangle 基础的行为(如 TMultiView)展开或缩回。谢谢
【解决方案2】:

我不认为你可以。但是您可以通过将空白按钮作为多视图的子项并添加单独的 TText 对象作为表单(或绝对不透明度为 1 的其他对象)的子项来实现效果,如下面的屏幕截图所示。例如,如果按钮可以移动或调整大小并不理想,但这可以通过创建一个 TPanel 来克服,例如,使 Multiview 和文本分离它的子项,然后使用面板进行移动和调整大小的目的,这将确保按钮及其相关文本保持一致。

编辑

鉴于 Tom Brunsberg 的 cmets,我建议将两者都设为 TPanel 的子代,而不是 TForm 的子代。当然,在我的测试中,他提到的 TText 回到后面的问题在完成后不会发生。他将 TText 对象的 HitTest 设置为 false 是完全正确的。

【讨论】:

  • 额外的TText 控件并不像您所说的在所有情况下都有效。 1) 在辅助形式中,当显示时,TText 控件位于TMultiView 的后面并且显示为灰色,即使在设计时移到前面也是如此。这可以通过在表单的OnShow 事件中调用Text1.BringToFront; 来解决。 2) 但是,最小化和恢复表单,将TText 再次放在TMultiView 后面。 3) TText 会吞下鼠标点击,除非您将 HitTest 设置为 false。
  • @TomBrunberg - 感谢您的 cmets,我一定会适当修改。现在,如果 TText 是表单的孩子,它可能会像您在评论 (2) 中所说的那样表现,但是当两者都是 TPanel 的孩子时,我没有发现这样的问题。项目 (3) 有两种可能的解决方案 - 如您所说,将 HitTest 设置为 false 或将文本框的大小(手动或可能以编程方式更好)以完全适合按钮并使用文本的 OnClick 事件。我不确定您对第 (1) 项的意思,但我怀疑它无论如何都与第 (2) 项有关,解决一个解决另一个。
  • @Dsm,我已经更改了示例图像以显示我想要做什么。谢谢!汤姆布伦伯格,谢谢你的解释。我仍然无法解决问题。
猜你喜欢
  • 2019-04-12
  • 2022-06-14
  • 1970-01-01
  • 1970-01-01
  • 2021-10-31
  • 2011-07-06
  • 1970-01-01
  • 2018-12-07
  • 2023-03-08
相关资源
最近更新 更多