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

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

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

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

我显然有这个错误。 BitmapLink的SourceRect坐标如何定义FireMonkey在呈现控件时应使用的位图。

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

最佳答案

我认为嵌入在.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)将PNG值从.Style文件复制到XFM文件中。注意还要修复Width和Height属性:
MultiResBitmap = <
  item
    Width = 750
    Height = 850
    PNG = {...}

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

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

10-05 20:29
查看更多