【问题标题】:Using TBitmapLinks with the FireMonkey Style Designer将 TBitmapLinks 与 FireMonkey 样式设计器一起使用
【发布时间】:2015-01-22 13:36:07
【问题描述】:

我一直在设计 FireMonkey 控件的样式,但我一直遇到一些实际问题,那就是如何使用 FireMonkey 样式设计器(尤其是位图样式设计器)将位图合并到 FireMonkey 样式中。某些样式对象(例如 TButtonStyleObject)具有 BitmapLink 属性,但我看不到它们在为 FireMonkey 控件生成的新自定义样式中是如何工作的。

让我尝试让问题尽可能透明。我添加了一个样书并将其资源设置为 Delphi 样式目录中的 MetropolisUIGreen.Style(在 XE7 中,它位于 C:\Users\Public\Documents\Embarcadero\Studio\16.0\Styles)。然后我打开 FireMonkey 样式设计器并找到 buttonstyle 样式,它由一个 TButtonStyleObject 和一个 TButtonStyleTextObject 组成,它们都是 TLayout 的父级。 TButtonStyleObject 的 SourceLookup 属性值为 MetroGreenstyle.png,这是一个 StyleName,与已加载 MetropolisUIGreen.png 图像的 TImage 相关联。

选择 TButtonStyleObject(其 StyleName 为背景)后,我检查 NormalLink 属性,它是 TBitmapLinks 的集合。据我了解,我在 NormalLink 中看到的一个 BitmapLink 包含有关应用于按钮的位图的信息,包括与 MetroGreenstyle.png 文件的矩形区域相对应的坐标 (SourceRect)。

我的假设似乎是错误的,因为当我使用图形程序检查 MetroGreenstyle.png 时,这些坐标没有什么有趣的地方。我检查了许多其他样式的 BitmapLinks,我也发现 SourceRect 坐标似乎并没有真正定义 stylelookup png 文件的有意义的区域。

我显然错了。 BitmapLink 的 SourceRect 坐标如何定义 FireMonkey 在渲染控件时应该使用的位图。

-- 编辑我实际上问了四个问题。我已经更新了这个问题,只包含一个问题。我将在另一篇文章中包含其他问题。 --

【问题讨论】:

    标签: delphi firemonkey firemonkey-style


    【解决方案1】:

    我认为嵌入在 .style 文件中的位图(作为资源嵌入)和存储在文件中的位图(C:\Users\Public\Documents\Embarcadero\Studio\15.0\Styles\MetropolisUIGreen .png,即 519x760)。

    嵌入位图的大小似乎与外部文件不同(您可以通过查看样式编辑器、选择 metrogreenstyle.png 节点、打开 MultiResBitmap 的属性编辑器并查看为 Scale 提供的图像大小来检查1.00:750x850。

    这解释了为什么坐标似乎全错了。不知道是外部文件过时了还是相反。

    HTH!

    更新:我设法提取了存储在 .style 文件中的位图,我可以确认坐标是相对于该位图的!

    更新(2): .style 文件和 .fmx 文件非常相似,所以你可以这样做:

    1) 用文本编辑器打开 MetropolisUIGreen.Style 并找到嵌入的位图(第 18 行),可以看到:

    object TImage
        StyleName = 'MetroGreenstyle.png'
        MultiResBitmap = <
          item
            Width = 0
            Height = 0
            PNG = {...}
    

    2) 创建一个新的 FMX 应用程序,在表单上添加一个 TImage 并加载一个位图(任何你想要的图片)

    3) 将 .Style 文件中的 PNG 值复制到 XFM 文件中。注意还要修复 Width 和 Height 属性:

    MultiResBitmap = <
      item
        Width = 750
        Height = 850
        PNG = {...}
    

    4) 您应该能够在设计时看到图片;

    5) 添加一个带有 Image1.Bitmap.SaveToFile('C:\temp\new_file.png'); 的按钮 运行程序并将文件保存到您的磁盘。 :-)

    【讨论】:

    • 嗨,安德里亚。感谢你的付出。在我将您的答案标记为正确之前,我需要验证您的答案。您是如何提取存储在 .style 文件中的位图的?
    • 安德里亚,这太棒了。再次感谢您的贡献。
    • 这是获得所有比例大小的方法--->> for I := 0 to img1.MultiResBitmap.Count -1 do begin sname := 'pic'+ img1.MultiResBitmap[i] .Scale.ToString +'.png'; img1.MultiResBitmap[i].Bitmap.SaveToFile(sname);结束;
    【解决方案2】:

    我想验证 Andreas 的解决方案。这就是我所做的。

    1. 按照 Andrea 的描述导出 .png
    2. 在 Photoshop 中打开 .png 并更改了一些不同的对象
    3. 从 Photoshop 中保存了 .png
    4. 已将其加载到我在步骤 1 中用于导出它的临时项目 TImage 中。
    5. Alt+F12 并将 png 内容复制到剪贴板中
    6. 将其直接粘贴到我的 .style 文件中(使用 Ultraedit)
    7. 在 Delphi 的样式编辑器中加载了 .style 文件

    所有的颜色变化都立即反映在我的设计中。可能有更简单的方法,但我不知道。我在 XE10 西雅图做了这个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-24
      • 2018-02-26
      • 2013-10-08
      相关资源
      最近更新 更多