Windows功能区框架:如何更改字体和大小?

11

如何更改Windows Ribbon Framework的UIRibbon使用的字体和字号?

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

请注意每个截图中功能区都变得越来越小:

Segoe UI 9pt(Windows默认)

alt text

Segoe UI 12pt(我使用的字体)

alt text

Segoe UI 16pt(客户所使用的字体)

alt text

当字体大小达到16pt时,缎带上的文字变得很难阅读。

背景

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

  • 8pt
  • 9pt
  • 12pt

和他们喜欢的字体类型,例如:

  • MS Sans Serif
  • Microsoft Sans Serif
  • Tahoma
  • Segoe UI
  • 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 颜色方案相匹配:

alt text

但我找不到更改字体/大小的选项。
注意:尽管功能区可能会遵循用户的 DPI 设置,但这不是这个问题。

在Outlook 2010中可用

值得注意的是,Outlook 2010的功能区确实遵循用户(菜单)字体偏好设置。您可以通过调用[SystemParametersInfo][6]来获取用户的菜单字体:

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

ncm.lfMenuFont <---

9pt Outlook 2010

alt text

12pt Outlook 2010

alt text

12pt Outlook 2010

alt text

请注意,字体大小增加时,功能区也会增大?(在这些调整大小的截图中,这意味着功能区并不会在视觉上变小。)
有两种可能性:
1. Outlook 2010 知道如何在 Windows 功能区框架中调整字体大小。 2. Outlook 2010 不使用 Windows 功能区框架。
Windows 7 的画图工具无法正常工作
还值得注意的是,Windows 7 中的画图工具不遵守用户的字体偏好设置。这让我相信它(mspaint)确实使用了 Windows 功能区框架,并且 Windows 功能区框架不支持设置字体大小。如果你已经尝试过帮助别人,并一直读到这里,你会意识到这是正确的答案:这是不可能的。因此,如果你想获得免费的300个声望,你可以将其添加为答案。
编辑:同时发布到微软 关键词:Windows 功能区框架、更改字体大小、UIRibbon、字体样式、功能区 UI、风景 UI、风景功能区、流畅功能区、流畅 UI、更改 Windows 功能区字体、uiribbon.h
Microsoft 有许多功能区实现:

MS Paint不支持菜单字体偏好设置

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

alt text


示例代码

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 Ribbon Framework的14pt并不等于14pt

这是一张截图,Windows菜单字体配置为14pt(在96dpi的机器上)。Outlook 2010和Photoshop CS3都是14pt,而Ribbon则更小。

alt text

参见


1
总是很高兴阅读到您亮闪闪的问题。也许我会抽出时间来调查一下这个问题。 - Andreas Rejbrand
这是Delphi吗?您正在使用Ribbons.pas TRibbon还是MS Ribbon?您是在Prism中使用还是在Delphi(win32)中使用?我认为Prism问题应该标记为Delphi-Prism而不是delphi。 - Warren P
这不是Delphi的功能区控件。微软有三个功能区库:Office Ribbon、WPF Ribbon和Windows Ribbon Framework。我不知道Delphi的控件包装了哪个微软功能区库(如果有的话)。但是我正在使用Windows Ribbon Framework,并且在Delphi中使用它。三个月后,我给问题打上了“delphi”标签,以便获得更多关注。由于我在Delphi中使用它,该标签有一定相关性-可能会吸引唯一使用它的人群。 - Ian Boyd
@Ian Boyd:我认为TRibbon是一个完全自定义的控件,完全由Delphi代码编写。因此,它不包装任何Microsoft控件。 - Andreas Rejbrand
嗯...这不应该是 CW,我想...有人编辑得太多了... - Andreas Rejbrand
显示剩余2条评论
3个回答

4

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

我刚开始尝试使用该框架,但是Ribbon会尊重我的偏好设置。

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: alt text 使用14pt: alt text 也许您更改了错误的选项?我已经设置了“菜单”元素的字体大小。
如果您有进一步的问题,请随时询问...
我刚刚检查了Win7画图。它确实尊重用户首选项。因此,我猜想您可能做错了什么或者确实更改了错误的选项。
按要求提供截图: alt text 看起来我们做了相同的事情。这真的很奇怪...

你能否将类似于我即将发布的截图添加到我的问题中 - 显示Windows 7菜单字体设置以及MSPaint? - Ian Boyd
我猜...你能告诉我在Windows 7中设置菜单字体为14pt的确切步骤吗? - Ian Boyd
1
我找到了错误。菜单字体大小6pt..13pt被分为同一“大小”组,而功能区没有变大。从14pt到24pt的每个点大小(我可以选择的最大值),功能区每个设置都会逐步变大。但就功能区而言,9pt、6pt和13pt都是相同大小的。你能确认一下吗? - Ian Boyd
是的,已经确认了。我也有一个“大小组”。但它只是6pt..10pt。当使用11pt时,我的系统上的功能区会变大。似乎这个阈值取决于...也许是另一个设置...也许是dpi? - bepe4711
最终,尽管它们可能会尊重用户的“菜单”偏好设置(尽管存在错误的实现),但似乎没有办法设置用于功能区的字体。您的帐户 DPI 设置是多少?我的工作默认为96dpi(在家中为131dpi)。 - Ian Boyd
显示剩余3条评论

3
根据Windows 7画图软件的行为,似乎不可能实现这个功能。 :)

*哦,天啊,有人回答了!哦 :( * 无论如何,你是一个好人,因为你读完了整个问题;你可能会因此获得声望。 - Ian Boyd
真是的,我正准备添加这个答案 :) - David
尽管我从bepe4711的回答中获得了有用的信息,但这个回答才是正确的。如何更改字体或大小? 答案:你不能 - Ian Boyd

2
如果您真的尝试过提供帮助,并一直读到这里,您会意识到这是正确的答案:这是不可能的。因此,如果您想要免费的300分声望,请将其作为答案添加。
由于我不能将其作为答案发布(George先发了:)),而且由于您似乎非常需要某种解决方案,我将发布唯一的其他有用的答案或建议来解决您的问题:使用不同的功能区控件。 您没有说出为什么要使用这个实现而不是Delphi自己的实现,甚至是其他Microsoft实现之一。
两个选项是:
  • 内置的 Delphi TRibbon 控件。我没有在任何公开发布的应用程序中使用过它,但我在自己的小型/测试程序中使用过,有些地方有一些小问题。(例如,在标题栏上的快捷方式栏中看到奇怪的绘图问题。)这个可能在 Delphi XE 中得到了改善。它可能存在类似的错误。但是,它随着 Delphi 一起发货,“免费”如果您拥有 Delphi,本机代码,VCL,并且作为 VCL 组件附带源代码,因此如果需要可以修复问题。

  • TMS Ribbon 控件。我没有使用过它,但我使用过另一个 TMS 控件。那个控件不错,他们的支持团队能够快速修复错误。(我已经确认了一个错误,一天之内就解决了,所以算上时区是“立即”,并在几天内发布了新版本。)

我相信其他组件供应商可能也会制作带状组件,我记得曾经看到有人制作了一个包含带状控件的SpTBXLib修改版,但我没有听说过太多相关信息。我的建议是使用TMS带状控件

1
我个人不会使用TRibbon,因为它太容易出现错误。如果我没记错的话,我对TMS控件也不是很喜欢。另一方面,微软控件非常高质量,所以我完全理解Ian想要使用它的原因。 - Andreas Rejbrand
2
原因如下:1)我正在使用Delphi 5。2)TMS Ribbon需要花钱购买。3)我提出这个问题是为了造福全人类;无论是Delphi、.NET还是C++,每个人都应该成为一个优秀的开发者,缴纳税款,做正确的事情,并尊重用户的字体设置和颜色方案。 - Ian Boyd
1
MS控件不需要Vista及以上版本吗?如果是这样的话,那么在一个可以忽略古老的工作马XP的环境中工作一定很不错! - David Heffernan
1
@David Heffernan 我不会忽略XP用户,我只是展示了一个非常糟糕的基于TPanel的模型。 - Ian Boyd

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