【问题标题】:Change Font in Bitmap Style Designer在位图样式设计器中更改字体
【发布时间】:2015-03-26 00:29:31
【问题描述】:

Delphi XE7 提供了“位图样式设计器”工具(“工具 > 位图样式设计器”),可用于为您的地铁主题应用程序编辑和创建样式。更改按钮、复选框和标签的图形和颜色可以工作并且看起来很漂亮。 但是如何更改字体设置?更准确地说:我该怎么做才能让字体设置对我的应用程序生效?

当然有一个 Fonts-Section 可以编辑自定义字体样式、-families、-sizes 等,但这些设置没有影响。但是我可以成功地改变那里的控件的颜色。

位图样式设计器还支持预览模式。这将显示一个带有自定义控件的窗口。即使没有使用自定义字体。对于此窗口,我无法应用任何设置,例如 ParentFont := TrueStyleElements := StyleElements + [seFont]

但我可以在应用自定义样式的应用程序中更改这些属性。不幸的是,结果保持不变。

最好的问候

【问题讨论】:

  • 您的问题并不清楚:您是否仅尝试在位图样式设计器中处理字体,或者您是否创建了包含样式的资源并尝试将其中一种样式应用于您的控件应用? (例如,可以在普通文本编辑器中编辑这样的样式)
  • 我修改了 MetropolisUIBlack.vsf 样式并在项目设置中定义了它,然后我重新编译了应用程序。问题是在 Demo-Form 中甚至没有考虑字体。
  • 你应用了样式吗? (重新编译不会应用该样式,尽管您可能会这么认为)。您是否尝试查看您的 .vsf 样式中是否还有其他内容? (即是仅字体被忽略,还是样式文件中的其他所有内容也被忽略?)
  • 我通过在我的 dpr 文件中使用TStyleManager.TrySetStyle(cStyle); 应用样式。以及我之前提到的所有控件的样式,因为我希望它们采用我的 vsf 样式。字体(系列、大小、颜色)是唯一没有应用的东西。

标签: delphi user-interface fonts styles themes


【解决方案1】:

Vcl 样式目前不从自定义样式中读取和应用完整的字体数据,只有颜色。

但是,通过一些黑客攻击,您可以访问自定义样式的完整字体信息,但您必须手动将字体应用于控件,或者您可以使用表单的ParentFont 属性。

通过以下代码,您可以访问存储在自定义样式中的字体(在 XE4 中测试,但基本思想可以应用于其他 Delphi 版本,如果有一些差异)

unit StyleFonts;

interface

uses
  Winapi.Windows,
  Winapi.Messages,
  System.SysUtils,
  System.Classes,
  System.Types,
  System.UITypes,
  System.Zlib,
  Vcl.Consts,
  Vcl.Graphics,
  Vcl.Controls,
  Vcl.Forms,
  Vcl.ImgList,
  Vcl.GraphUtil,
  Vcl.Styles,
  Vcl.Themes;

function GetStyleFont(Font: TStyleFont): TFont;

implementation

// use files from source\vcl
{$I StyleUtils.inc}
{$I StyleAPI.inc}

var
  SystemFont: TFont;

procedure InitializeSystemFont;
var
  NonClientMetrics: TNonClientMetrics;
begin
  SystemFont := TFont.Create;
  FillChar(NonClientMetrics, SizeOf(NonClientMetrics), 0);
  // following function will fill up cbSize with correct size for XP system
  NonClientMetrics.cbSize := TNonClientMetrics.SizeOf;
  if SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, @NonClientMetrics, 0) then
    SystemFont.Handle := CreateFontIndirect(NonClientMetrics.lfMessageFont)
end;

type
  TStyleHelper = class helper for TCustomStyle
  public
    function GetSource: TObject; { TseSkin }
  end;

function TStyleHelper.GetSource: TObject;
begin
  Result := Self.FSource;
end;

function GetStyleFont(Font: TStyleFont): TFont;
var
  LStyle: TCustomStyle;
  FSource: TObject;
  SeFont: TSeStyleFont;
begin
  if TStyleManager.IsCustomStyleActive then
    begin
      LStyle := TCustomStyle(TStyleManager.ActiveStyle);
      FSource := LStyle.GetSource;
      // case based on Vcl.Styles TCustomStyle.DoGetStyleFontColor
      case Font of
        sfButtonTextDisabled: Result := TSeStyle(FSource).Fonts[ktfButtonTextDisabled];
        sfButtonTextFocused: Result := TSeStyle(FSource).Fonts[ktfButtonTextFocused];
        sfButtonTextHot: Result := TSeStyle(FSource).Fonts[ktfButtonTextHot];
        sfButtonTextNormal: Result := TSeStyle(FSource).Fonts[ktfButtonTextNormal];
        sfButtonTextPressed: Result := TSeStyle(FSource).Fonts[ktfButtonTextPressed];
        sfCaptionTextInactive: Result := TSeStyle(FSource).Fonts[ktfCaptionTextInactive];
        sfCaptionTextNormal: Result := TSeStyle(FSource).Fonts[ktfCaptionTextNormal];
        sfCategoryPanelGroupHeaderHot: Result := TSeStyle(FSource).Fonts[ktfCategoryPanelGroupHeaderHot];
        sfCategoryPanelGroupHeaderNormal: Result := TSeStyle(FSource).Fonts[ktfCategoryPanelGroupHeaderNormal];
        sfCatgeoryButtonsCategoryNormal: Result := TSeStyle(FSource).Fonts[ktfCatgeoryButtonsCategoryNormal];
        sfCatgeoryButtonsCategorySelected: Result := TSeStyle(FSource).Fonts[ktfCatgeoryButtonsCategorySelected];
        sfCatgeoryButtonsHot: Result := TSeStyle(FSource).Fonts[ktfCatgeoryButtonsHot];
        sfCatgeoryButtonsNormal: Result := TSeStyle(FSource).Fonts[ktfCatgeoryButtonsNormal];
        sfCatgeoryButtonsSelected: Result := TSeStyle(FSource).Fonts[ktfCatgeoryButtonsSelected];
        sfCheckBoxTextDisabled: Result := TSeStyle(FSource).Fonts[ktfCheckBoxTextDisabled];
        sfCheckBoxTextFocused: Result := TSeStyle(FSource).Fonts[ktfCheckBoxTextFocused];
        sfCheckBoxTextHot: Result := TSeStyle(FSource).Fonts[ktfCheckBoxTextHot];
        sfCheckBoxTextNormal: Result := TSeStyle(FSource).Fonts[ktfCheckBoxTextNormal];
        sfCheckBoxTextPressed: Result := TSeStyle(FSource).Fonts[ktfCheckBoxTextPressed];
        sfComboBoxItemDisabled: Result := TSeStyle(FSource).Fonts[ktfComboBoxItemDisabled];
        sfComboBoxItemFocused: Result := TSeStyle(FSource).Fonts[ktfComboBoxItemFocused];
        sfComboBoxItemHot: Result := TSeStyle(FSource).Fonts[ktfComboBoxItemHot];
        sfComboBoxItemNormal: Result := TSeStyle(FSource).Fonts[ktfComboBoxItemNormal];
        sfComboBoxItemSelected: Result := TSeStyle(FSource).Fonts[ktfComboBoxItemSelected];
        sfEditBoxTextDisabled: Result := TSeStyle(FSource).Fonts[ktfEditBoxTextDisabled];
        sfEditBoxTextFocused: Result := TSeStyle(FSource).Fonts[ktfEditBoxTextFocused];
        sfEditBoxTextHot: Result := TSeStyle(FSource).Fonts[ktfEditBoxTextHot];
        sfEditBoxTextNormal: Result := TSeStyle(FSource).Fonts[ktfEditBoxTextNormal];
        sfEditBoxTextSelected: Result := TSeStyle(FSource).Fonts[ktfEditBoxTextSelected];
        sfGridItemFixedHot: Result := TSeStyle(FSource).Fonts[ktfGridItemFixedHot];
        sfGridItemFixedNormal: Result := TSeStyle(FSource).Fonts[ktfGridItemFixedNormal];
        sfGridItemFixedPressed: Result := TSeStyle(FSource).Fonts[ktfGridItemFixedPressed];
        sfGridItemNormal: Result := TSeStyle(FSource).Fonts[ktfGridItemNormal];
        sfGridItemSelected: Result := TSeStyle(FSource).Fonts[ktfGridItemSelected];
        sfGroupBoxTextDisabled: Result := TSeStyle(FSource).Fonts[ktfGroupBoxTextDisabled];
        sfGroupBoxTextNormal: Result := TSeStyle(FSource).Fonts[ktfGroupBoxTextNormal];
        sfHeaderSectionTextDisabled: Result := TSeStyle(FSource).Fonts[ktfHeaderSectionTextDisabled];
        sfHeaderSectionTextHot: Result := TSeStyle(FSource).Fonts[ktfHeaderSectionTextHot];
        sfHeaderSectionTextNormal: Result := TSeStyle(FSource).Fonts[ktfHeaderSectionTextNormal];
        sfHeaderSectionTextPressed: Result := TSeStyle(FSource).Fonts[ktfHeaderSectionTextPressed];
        sfListItemTextDisabled: Result := TSeStyle(FSource).Fonts[ktfListItemTextDisabled];
        sfListItemTextFocused: Result := TSeStyle(FSource).Fonts[ktfListItemTextFocused];
        sfListItemTextHot: Result := TSeStyle(FSource).Fonts[ktfListItemTextHot];
        sfListItemTextNormal: Result := TSeStyle(FSource).Fonts[ktfListItemTextNormal];
        sfListItemTextSelected: Result := TSeStyle(FSource).Fonts[ktfListItemTextSelected];
        sfMenuItemTextDisabled: Result := TSeStyle(FSource).Fonts[ktfMenuItemTextDisabled];
        sfMenuItemTextHot: Result := TSeStyle(FSource).Fonts[ktfMenuItemTextHot];
        sfMenuItemTextNormal: Result := TSeStyle(FSource).Fonts[ktfMenuItemTextNormal];
        sfMenuItemTextSelected: Result := TSeStyle(FSource).Fonts[ktfMenuItemTextSelected];
        sfPanelTextDisabled: Result := TSeStyle(FSource).Fonts[ktfPanelTextDisabled];
        sfPanelTextNormal: Result := TSeStyle(FSource).Fonts[ktfPanelTextNormal];
        sfPopupMenuItemTextDisabled: Result := TSeStyle(FSource).Fonts[ktfPopupMenuItemTextDisabled];
        sfPopupMenuItemTextHot: Result := TSeStyle(FSource).Fonts[ktfPopupMenuItemTextHot];
        sfPopupMenuItemTextNormal: Result := TSeStyle(FSource).Fonts[ktfPopupMenuItemTextNormal];
        sfPopupMenuItemTextSelected: Result := TSeStyle(FSource).Fonts[ktfPopupMenuItemTextSelected];
        sfRadioButtonTextDisabled: Result := TSeStyle(FSource).Fonts[ktfRadioButtonTextDisabled];
        sfRadioButtonTextFocused: Result := TSeStyle(FSource).Fonts[ktfRadioButtonTextFocused];
        sfRadioButtonTextHot: Result := TSeStyle(FSource).Fonts[ktfRadioButtonTextHot];
        sfRadioButtonTextNormal: Result := TSeStyle(FSource).Fonts[ktfRadioButtonTextNormal];
        sfRadioButtonTextPressed: Result := TSeStyle(FSource).Fonts[ktfRadioButtonTextPressed];
        sfSmCaptionTextInactive: Result := TSeStyle(FSource).Fonts[ktfSmCaptionTextInactive];
        sfSmCaptionTextNormal: Result := TSeStyle(FSource).Fonts[ktfSmCaptionTextNormal];
        sfStatusPanelTextDisabled: Result := TSeStyle(FSource).Fonts[ktfStatusPanelTextDisabled];
        sfStatusPanelTextNormal: Result := TSeStyle(FSource).Fonts[ktfStatusPanelTextNormal];
        sfTabTextActiveDisabled: Result := TSeStyle(FSource).Fonts[ktfTabTextActiveDisabled];
        sfTabTextActiveHot: Result := TSeStyle(FSource).Fonts[ktfTabTextActiveHot];
        sfTabTextActiveNormal: Result := TSeStyle(FSource).Fonts[ktfTabTextActiveNormal];
        sfTabTextInactiveDisabled: Result := TSeStyle(FSource).Fonts[ktfTabTextInactiveDisabled];
        sfTabTextInactiveHot: Result := TSeStyle(FSource).Fonts[ktfTabTextInactiveHot];
        sfTabTextInactiveNormal: Result := TSeStyle(FSource).Fonts[ktfTabTextInactiveNormal];
        sfTextLabelDisabled: Result := TSeStyle(FSource).Fonts[ktfStaticTextDisabled];
        sfTextLabelFocused: Result := TSeStyle(FSource).Fonts[ktfStaticTextFocused];
        sfTextLabelHot: Result := TSeStyle(FSource).Fonts[ktfStaticTextHot];
        sfTextLabelNormal: Result := TSeStyle(FSource).Fonts[ktfStaticTextNormal];
        sfToolItemTextDisabled: Result := TSeStyle(FSource).Fonts[ktfToolItemTextDisabled];
        sfToolItemTextHot: Result := TSeStyle(FSource).Fonts[ktfToolItemTextHot];
        sfToolItemTextNormal: Result := TSeStyle(FSource).Fonts[ktfToolItemTextNormal];
        sfToolItemTextSelected: Result := TSeStyle(FSource).Fonts[ktfToolItemTextSelected];
        sfTreeItemTextDisabled: Result := TSeStyle(FSource).Fonts[ktfTreeItemTextDisabled];
        sfTreeItemTextFocused: Result := TSeStyle(FSource).Fonts[ktfTreeItemTextFocused];
        sfTreeItemTextHot: Result := TSeStyle(FSource).Fonts[ktfTreeItemTextHot];
        sfTreeItemTextNormal: Result := TSeStyle(FSource).Fonts[ktfTreeItemTextNormal];
        sfTreeItemTextSelected: Result := TSeStyle(FSource).Fonts[ktfTreeItemTextSelected];
        sfWindowTextDisabled: Result := TSeStyle(FSource).Fonts[ktfWindowTextDisabled];
        sfWindowTextNormal: Result := TSeStyle(FSource).Fonts[ktfWindowTextNormal];
        else Result := SystemFont;
      end;
    end
  else Result := SystemFont;
end;

initialization

  InitializeSystemFont;

finalization

  SystemFont.Free;

end.

【讨论】:

  • 感谢您的回答,达莉娅。实际上,通过在 MainForm 中定义应用程序的默认字体和通过激活 ParentFont 属性设置每个子控件的样式,这非常有效。不幸的是,为应用程序的上下文或应用程序菜单设置样式可能并不容易。
  • 您可以使用Screen属性HintFontIconFontMenuFontMessageFontCaptionFont来更改其他应用程序的字体外观
  • 谢谢!这适用于我的 TPopUpMenus。也许还应该提到,必须设置属性OwnerDraw := True 才能让Screen.MenuFont 属性生效。通过更改字体大小,未正确导出 MenuItems 的高度。这个问题可以通过使用TMenuItem的OnMeasureItem-Event解决。
  • @DalijaPrasnikar 我创建了一个 QC 请求,如果人们不喜欢这些黑客,他们可以投票:quality.embarcadero.com/browse/RSP-13517 - 请随时使用此链接更新您的答案。
  • @JamesJohnston 感谢您的报告,投票。我认为在评论中链接到 QP 报告就足够了。您也可以将其发布到Delphi Developers G+ 以获得更多可见性。比起埋在这里,它会吸引更多的关注和投票。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-20
  • 2011-11-22
  • 2011-12-02
  • 2011-09-15
相关资源
最近更新 更多