【问题标题】:Windows Ribbon Framework: How to change font face and size?Windows 功能区框架:如何更改字体和大小?
【发布时间】:2010-04-17 18:33:41
【问题描述】:

如何更改Windows Ribbon Framwork 的 UIRibbon 使用的字体和字体大小?

功能区使用的字体与用户选择作为其 Windows 首选项的字体不匹配 - 这是我的应用程序使用的首选项。这意味着随着 Windows 中的字体变大,功能区会变小。

注意每个屏幕截图中功能区如何变小:

Segoe UI 9pt(Windows 默认)

Segoe UI 12pt(我用什么)

Segoe UI 16pt(客户使用什么)

当我们达到 16pt 时,您可以看到,功能区上的文字很难阅读。

背景

用户可以配置 Windows 以使用他们喜欢的字体大小,例如:

  • 8pt
  • 9pt
  • 12pt

以及他们喜欢的字体,例如:

  • MS 无衬线字体
  • 微软无衬线字体
  • 塔霍马
  • Segoe 用户界面
  • Calibri

Windows Ribbon Framework 默认使用不是用户偏好的字体。

编辑: 将图片上移以捕捉被闪亮的东西吸引的松鼠。
编辑 2: 添加另一张彩色图片,以获得凹凸。
编辑 3: 编辑以获得凹凸
编辑 4: 添加另一张不同的图片以获得凹凸


功能区允许自定义功能区的颜色

以下代码片段用于设置功能区的UI_PKEY_GlobalBackgroundColor。在这种情况下,我使用用户当前选择的 Aero 配色方案的颜色:

    IUIFramework framework;
    ...

    TColor glass = Dwm.GetColorizationColor();
    VarCast(v, ColorToUIHSB(glass), UI_PKEY_GlobalBackgroundColor.pid);

    IPropertyStore ps = framework as IPropertyStore;
    ps.SetValue(UI_PKEY_GlobalBackgroundColor, PROPVARIANT(v));
    ps.Commit;

现在功能区的颜色与 Windows 的配色方案相匹配:

但我找不到更改字体/大小的选项。

注意:虽然功能区可能遵循用户的 DPI 设置,但这不是这个问题。


它适用于 Outlook 2010

注意 Outlook 2010 的功能区确实尊重用户的(菜单)字体首选项,这可能会有所帮助。可以通过调用[SystemParametersInfo][6]获取用户的菜单字体:

SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm, 0));

ncm.lfMenuFont <---

9pt 展望 2010

2010 年 12 点展望

2010 年 12 点展望

注意到功能区的大小随着字体大小而增加? (在这些调整大小的屏幕截图中,这意味着功能区不会在感知上变小。)

有两种可能:

  • Outlook 2010 知道如何在 Windows Ribbon Framework 中调整字体大小
  • Outlook 2010 不使用 Windows 功能区框架

Windows 7 画图不起作用

还需要注意的是,Windows 7 中的 Windows Paint 确实尊重用户的字体首选项。这让我相信它(mspaint)确实使用了 Windows Ribbon Framework,并且 Windows Ribbon Framework 不支持设置字体大小。如果你真的试图提供帮助,并一直阅读到这里,你会意识到这是正确的答案:这是不可能的。所以如果你想要一个免费的 300 代表,你可以添加它作为答案。

编辑: Cross-posted to Microsoft

关键字: Windows Ribbon Framework,改变字体大小,UIRibbon,字体,ribbon ui,scenery ui,scenery ribbon,fluent 功能区,fluent ui,改变字体窗口功能区,uiribbon.h

Microsoft 有许多 Ribbon 实现:


MS Paint 不支持菜单字体偏好

这是一个屏幕截图,显示了我配置的 Windows 7 菜单字体设置为 12pt,msPaint 可见,Outlook 2010 可见以进行比较。


示例代码

type 
    TfrmRibbonTest = class(TForm, IUIApplication)
      ...
    private
       Fframework: IUIFramework;

       {IUIApplication}
       function  OnViewChanged(viewId: SYSUINT; typeID: UI_VIEWTYPE; const view: IUnknown; verb: UI_VIEWVERB; uReasonCode: SYSINT): HResult; stdcall;
       function  OnCreateUICommand(commandId: SYSUINT; typeID: UI_COMMANDTYPE; out commandHandler: IUICommandHandler): HResult; stdcall;
       function  OnDestroyUICommand(commandId: SYSUINT; typeID: UI_COMMANDTYPE; const commandHandler: IUICommandHandler): HResult; stdcall;
    end;


procedure TForm1.Button1Click(Sender: TObject);
var
   hr: HRESULT;
begin
   Fframework := CreateComObject(CLASS_UIRibbonFramework) as IUIFramework;
   hr := Fframework.Initialize(Self.Handle, Self); //we implement IUIApplication
   OleCheck(hr);
   hr := Fframework.LoadUI(hInstance, 'APPLICATION_RIBBON');
   OleCheck(hr);
end;

function TfrmRibbonTest.OnCreateUICommand(commandId: SYSUINT; typeID: UI_COMMANDTYPE; out commandHandler: IUICommandHandler): HResult;
begin
    Result := S_OK;
end;

function TfrmRibbonTest.OnDestroyUICommand(commandId: SYSUINT; typeID: UI_COMMANDTYPE;
  const commandHandler: IUICommandHandler): HResult;
begin
    Result := S_OK;
end;

function TfrmRibbonTest.OnViewChanged(viewId: SYSUINT; typeID: UI_VIEWTYPE; const view: IUnknown; verb: UI_VIEWVERB; uReasonCode: SYSINT): HResult;
begin
    Result := S_OK;
end;

Windows 功能区框架 14pt != 14pt

这是一个屏幕截图,其中 Windows Menu 字体配置为 14pt(在 96dpi 机器上)。 Outlook 2010 是 14pt,Photoshop CS3 是 14pt。丝带……少了。

另见

【问题讨论】:

  • 总是很高兴阅读您的闪亮问题。也许我会抽出时间来调查一下。
  • @Andreas:我的DwmGetColorizationColor 问题是什么...你在附近?更新:你是!我的上帝,你很容易被闪亮的东西分心,不是吗!
  • 这是德尔福?您使用的是 Ribbons.pas TRibbon 还是 MS Ribbon?您是在 Prism 中使用它,还是在 Delphi (win32) 中使用它?我认为 Prism 问题应该标记为 Delphi-Prism 而不是 delphi。
  • 这不是 Delphi 的功能区控件。 Microsoft 有 3 个功能区库:Office 功能区、WPF 功能区和 Windows 功能区框架。我不知道 Delphi 的控件包装了哪个 Microsoft 功能区库(如果有)。但我使用的是 Windows 功能区框架,并且我使用的是 Delphi 的。 3 个月后,我标记了问题delphi,以吸引更多眼球。因为我在 Delphi 中使用它,所以标签有点相关 - 并且可能会吸引唯一使用它的人群。
  • @Ian Boyd:我认为TRibbon 是一个完全自定义的控件,完全用Delphi 代码编写。因此,它不包装任何 Microsoft 控件。

标签: delphi winapi ribbon user-preferences windows-ribbon-framework


【解决方案1】:

根据 Windows 7 Paint 的行为,这似乎是不可能的。 :)

【讨论】:

  • *omg,有人回答了!哦 :(* 好吧,你是阅读整个问题的好人;你可能会因为这样做而得到代表。
  • 该死,我要添加这个答案:)
  • 尽管我从 bepe4711 的答案中获得了有用的信息,但这个答案是正确的。 如何更改字体或大小? 答:你不能
【解决方案2】:

我不太确定。您在 Delphi 中使用 Windows Ribbon Framework 并遇到这种奇怪的行为?

我刚刚开始使用框架,但功能区尊重我的偏好。

TUIApp = class(TInterfacedObject, IUIApplication)
...
gApp: TUIApp;
uiFrame: IUIFramework;
...
  CoCreateInstance(CLSID_UIRibbonFramework, nil, CLSCTX_INPROC_SERVER, IUIFramework, uiFrame);

  if Succeeded(uiFrame.Initialize(Handle, gApp)) then
  begin
     if not Succeeded(uiFrame.LoadUI(GetModuleHandle(nil), PChar('SIMPLERIBBON_RIBBON')))then
        sleep(5);
  end;

这就是我在我的测试项目中所做的一切。

9pt:

还有 14pt:

也许您更改了错误的选项?我已经设置了“菜单”元素的字体大小。

如果您还有其他问题,尽管问...


我刚刚检查了 Win7 Paint。它确实尊重用户的偏好。因此我猜你做错了什么或者真的改变了错误的选项。


根据要求截图:

看起来我们也做了同样的事情。这很奇怪……

【讨论】:

  • 您能否发布一个类似于我将暂时回答我的问题的屏幕截图 - 显示 Windows 7 菜单字体设置以及 mspaint?
  • 我猜....给我你在 Windows 7 中将菜单字体设置为 14pt 的确切步骤?
  • 我猜我做了你所做的...我进入“高级外观设置”,选择“菜单”项,更改字体大小并点击“应用”...然后立即(好吧,花了一些时间)功能区被调整大小(我的功能区除外;我必须重新启动我的测试应用程序).​​.....
  • 好吧,我发现了这个错误。 Menu 字体大小 6pt..13pt 被分组为相同的“大小”,功能区没有变大。每个点的大小从 14pt 到 24pt(我可以选择的最大值),功能区在每个设置中都会逐渐变大。但就功能区而言,9pt、6pt 和 13pt 的大小都相同。你能确认一下吗?
  • 是的,以某种方式确认。我也有一个“大小组”。但它只是 6pt..10pt。使用 11pt 时,我系统上的色带会变大。似乎阈值取决于..也许是另一个设置..也许是 dpi?
【解决方案3】:

如果你真的尝试过 有帮助,并一直阅读到 在这里,你会意识到这是 正确答案:不可能。所以 如果你想要一个免费的 300 代表,你添加 作为答案。

由于我无法将其发布为答案(乔治首先进入 :)),而且您似乎迫切需要某种解决方案,所以我将发布 only我可以提供其他有用的答案或建议来解决您的问题:使用不同的功能区控件。您没有说明为什么要使用此实现而不是 Delphi 自己的实现,甚至是其他 Microsoft 的实现那些。

两个选项是:

  • inbuilt Delphi TRibbon 控件。我没有在任何公开发布的应用程序中使用它,但是我在自己的小型/测试程序中使用它,并且它在某些地方有点错误。 (例如,我在标题栏上的快捷栏上看到了奇怪的绘图问题。)这个may have improved in Delphi XE。有可能suffers from a similar bug。但是,它是随 Delphi 一起提供的,如果你有 Delphi、本机代码、VCL,它是“免费的”,并且作为 VCL 组件,源代码附带,因此你可以在必要时进行修复。

  • TMS ribbon control。我没用过,但我用过another TMS control。这种控制很好,他们的支持可以快速修复错误。 (我已经在一天内确认了一个错误,因此“立即”计算时区,并在几天后发布了一个新版本。)

我相信其他组件供应商可能会制作功能区组件,我确实记得读过有人制作了包含功能区控件的 SpTBXLib 修改,但我对它们的了解不多。我的建议是使用 TMS 功能区

【讨论】:

  • 我个人不会使用TRibbon。它太麻烦了。如果我没记错的话,我也不是很了解 TMS 控件。另一方面,Microsoft 控件的质量非常高,因此我完全理解 Ian 想要使用它。
  • 原因:1) 我用的是 Delphi 5。2) TMS 色带要花钱。 3)我问一个问题是为了全人类的利益; Delphi、.NET、C++ 等。每个人都应该是优秀的开发者,纳税,做正确的事,尊重用户的字体设置和配色方案。
  • MS 控件不需要 Vista 及更高版本吗?如果是这样,那么在一个您可以忽略 XP 的古老主力的环境中一定很好!
  • @David Heffernan 我不会忽视 XP 用户。我只是展示了一个非常糟糕的基于TPanel 的模型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-25
  • 2015-10-22
  • 1970-01-01
  • 2014-01-02
相关资源
最近更新 更多