使用FireMonkey样式设计器与TBitmapLinks

12
我一直在为FireMonkey控件设置样式,但是有一个问题我一直遇到了实质性的困难,那就是如何使用FireMonkey Style Designer(而不是Bitmap Style Designer)将位图合并到FireMonkey样式中。某些已经设置好的对象(例如TButtonStyleObject)具有BitmapLink属性,但是我无法看出它们如何在为FireMonkey控件生成新的自定义样式时工作。
让我尽可能地阐明这个问题。我添加了一个StyleBook并将其资源设置为Delphi样式目录中的MetroplisUIGreen.Style(在XE7中,此目录位于C:\Users\Public\Documents\Embarcadero\Studio\16.0\Styles)。然后我打开了FireMonkey Style Designer并找到buttonstyle样式,该样式由TButtonStyleObject和TButtonStyleTextObject组成,两者都附加在TLayout上。 TButtonStyleObject具有MetroGreenstyle.png的SourceLookup属性值,这是与MetropolisUIGreen.png图像一起加载的TImage相关的StyleName。
选择TButtonStyleObject(其StyleName为background)后,我检查NormalLink属性,它是TBitmapLinks的集合。我的理解是,我在NormalLink中看到的一个BitmapLink包含有关应用于按钮的位图的信息,包括与MetroGreenstyle.png文件中矩形区域相对应的坐标(SourceRect)。
我的假设似乎是错误的,因为当我使用图形程序检查MetroGreenstyle.png时,这些坐标没有任何有趣的内容。我检查了许多其他样式的BitmapLinks,也发现其中SourceRect坐标似乎并不真正定义样式查找png文件的有意义的区域。
我的理解可能是错误的。当渲染控件时,BitmapLink的SourceRect坐标如何确定FireMonkey应使用哪个位图。
2个回答

7

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

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

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

希望对您有所帮助!

更新:我成功提取了存储在.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'); 运行程序并将文件保存至您的磁盘。 :-)


你好,Andrea。感谢你的努力。在我标记你的答案为正确之前,我需要验证一下你是如何提取.style文件中存储的位图的? - Cary Jensen
Andrea,这太棒了。再次感谢您的贡献。 - Cary Jensen
3
以下是获取所有缩放尺寸的方法--->> 对于I从0到img1.MultiResBitmap.Count -1的每个值,执行以下操作:
  • 将变量sname设置为 'pic'+ img1.MultiResBitmap[i].Scale.ToString +'.png';
  • 保存img1.MultiResBitmap[i].Bitmap图像至文件sname。
- Dangas56

2
我想验证Andreas的解决方案,我做了以下操作:
  1. 按照Andrea的描述导出.png文件
  2. 在Photoshop中打开.png文件并更改其中的一些对象
  3. 保存修改后的.png文件
  4. 将它加载到用于在步骤1中导出的临时项目TImage中
  5. 键盘快捷键Alt+F12并将png内容复制到剪贴板中
  6. 直接将其粘贴到我的.style文件中(使用Ultraedit)
  7. 在Delphi中的样式编辑器中加载.style文件
所有颜色的更改都立即反映在我的设计中。可能有一种更简单的方法,但我不知道。我在XE10 Seattle上执行了此操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接