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

时间:2010-04-17 18:33:41

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

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

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

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

Segoe UI 9pt(Windows默认值)

alt text

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

alt text

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

alt text

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

背景

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

  • 8PT
  • 9pt的
  • 12磅

及其首选的字体,例如:

  • MS Sans Serif
  • Microsoft Sans Serif
  • 宋体
  • Segoe UI
  • 宋体

Windows功能区框架默认情况下使用用户首选项的字体。

编辑:将图片向上移动以捕捉被闪亮的东西吸引的松鼠 编辑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 http://i44.tinypic.com/287dufp.jpg

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

注意:虽然功能区可能尊重用户的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

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

有两种可能性:

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

Windows 7 Paint不起作用

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

修改: Cross-posted to Microsoft

关键字: Windows功能区框架,更改字体大小,UIRibbon,字体外观,功能区ui,风景ui,风景色带,流利功能区,流畅ui,更改字体窗口功能区,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

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

alt text

另见

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

我不确定..你在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: alt text

以14pt: alt text

也许你改错了选项?我已经设置了“Menu”元素的字体大小。

如果您还有其他问题,请问......


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


根据要求截图: alt text

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

答案 2 :(得分:2)

  

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

由于我不能将其作为答案发布(乔治首先进入那里:)),并且由于您似乎迫切需要某种解决方案,我将仅发布 我可以给出解决问题的其他有用的答案或建议:使用不同的功能区控件。你没有说明为什么你使用这个实现而不是Delphi自己的,甚至是其中一个Microsoft的。

有两个选项:

  • inbuilt Delphi TRibbon控件。我没有在任何公开发布的应用程序中使用它,但我在我自己的小/测试程序中,它在一些地方有点儿。 (例如,我在标题栏上的快捷栏栏中看到了奇怪的绘图问题。)may have improved in Delphi XE。有可能suffers from a similar bug。但是,如果你有Delphi,本机代码,VCL以及作为VCL组件的源代码,那么它随Delphi一起提供,“免费”,所以你可以在必要时解决问题。

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

我相信其他组件供应商可能会制作功能区组件,而且我确实记得读过那些制作包含功能区控件的SpTBXLib修改的人,但我没有听说过很多。我的建议是使用TMS功能区