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

Ian*_*oyd 9 delphi winapi ribbon user-preferences windows-ribbon-framework

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

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

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

Segoe UI 9pt(Windows默认)

替代文字

Segoe UI 12pt(我用的是什么)

替代文字

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

替代文字

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

背景

用户可以将Windows配置为使用其首选字体大小,例如:

  • 8PT
  • 宋体
  • 12磅

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

  • MS Sans Serif
  • 微软Sans Serif
  • 宋体
  • Segoe UI
  • 宋体

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;
Run Code Online (Sandbox Code Playgroud)

现在,色带现在已着色,以匹配Windows的配色方案:

替代文字http://i44.tinypic.com/287dufp.jpg

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

注意:虽然功能区可能符合用户的DPI设置,但这不是问题.


它适用于Outlook 2010

注意Outlook 2010的功能区确实符合用户的(菜单)字体首选项可能会有所帮助.您可以通过以下方式获取用户的菜单字体[SystemParametersInfo][6]:

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

ncm.lfMenuFont <---
Run Code Online (Sandbox Code Playgroud)

9pt Outlook 2010

替代文字

12pt Outlook 2010

替代文字

12pt Outlook 2010

替代文字

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

有两种可能性:

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

Windows 7 Paint不起作用

注意Windows 7中的Windows Paint 符合用户的字体首选项也很有用.这使我相信它(mspaint)确实使用Windows功能区框架,并且Windows功能区框架不支持设置字体大小.如果你真的试图提供帮助,并一直读到这里,你会发现这是正确的答案:这是不可能的.因此,如果您想要一个免费的300代表,您可以添加它作为答案.

编辑: 交叉发布到Microsoft

关键字: Windows功能区框架,更改字体大小,UIRibbon,字体面,功能区ui,风景ui,风景色带,流畅的功能区,流畅的ui,更改字体窗口功能区,uiribbon.h

Microsoft有许多功能区实现:


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;
Run Code Online (Sandbox Code Playgroud)

Windows Ribbon Framework 14pt!= 14pt

以下是配置为14pt(在96dpi机器上)的Windows 菜单字体的屏幕截图.Outlook 2010是14pt,Photoshop CS3是14pt.功能区是......少.

替代文字

也可以看看

Geo*_*rge 3

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