Windows Ribbon Framework:如何更改字体和大小?

2024-01-06

如何更改所使用的字体和字体大小Windows 功能区框架 https://learn.microsoft.com/en-us/windows/win32/windowsribbon/-uiplat-windowsribbon-entry的 UIRibbon?

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

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

Segoe UI 9pt(Windows 默认)

Segoe UI 12pt(我用的)

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

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

背景

用户可以配置 Windows 以使用他们的首选字体大小, e.g.:

  • 8pt
  • 9pt
  • 12pt

以及他们的首选字体, e.g.:

  • MS 无衬线字体
  • 微软无衬线字体
  • Tahoma
  • Segoe UI
  • Calibri

but the Windows 功能区框架默认情况下使用的字体是not用户的偏好。

Edit:将图片移至顶部以捕捉被闪亮物体吸引的松鼠。
Edit 2:添加了另一张彩色图片,以获得凹凸。
Edit 3:编辑以获得凹凸
Edit 4:添加另一张不同的图片以获得凹凸


功能区确实允许自定义colors丝带的。

下面的代码片段用于设置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 的配色方案相匹配:

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

Note:当丝带may尊重用户的 DPI 设置,这不是this问题。


它适用于 Outlook 2010

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

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

ncm.lfMenuFont <---

9分展望2010年

2010年12点展望

2010年12点展望

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

有两种可能:

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

Windows 7 画图功能无法使用

还需要注意的是,Windows 7 中的 Windows Paint 可以not尊重用户的字体偏好。这让我相信它(mspaint)确实使用了 Windows Ribbon Framework,并且 Windows Ribbon Framework 不支持设置字体大小。如果您确实尝试过提供帮助,并一直阅读到这里,您就会意识到这是正确的答案:这是不可能的。因此,如果您想要免费的 300 次代表,您可以将其添加为答案。

Edit: 交叉发布到 Microsoft https://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/2c6def3a-9a42-4da1-8fda-046885dd0782/windows-ribbon-framework-how-to-change-font-face-and-size?forum=windowsribbondevelopment

关键词:Windows功能区框架,更改字体大小,UIRibbon,字体,功能区ui,风景ui,风景功能区,流畅的功能区,流畅的ui,更改字体windows功能区,uiribbon.h

Microsoft 有许多 Ribbon 实现:

  • Windows 功能区框架 https://learn.microsoft.com/en-us/windows/win32/windowsribbon/-uiplat-windowsribbon-entry- 本国的
  • 用于 MFC 的 CMFCRibbonBar https://learn.microsoft.com/en-us/cpp/mfc/reference/cmfcribbonbar-class?view=vs-2019 - MFC
  • 功能区 (WPF) https://learn.microsoft.com/en-us/previous-versions/ff799534(v=vs.110) - WPF
  • ribbon.codeplex.com https://archive.codeplex.com/?p=ribbon- WinForms(不支持)

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。功能区...更少。

See also

  • https://i.stack.imgur.com/VseEN.png https://i.stack.imgur.com/VseEN.png
  • http://i42.tinypic.com/15x0pj5.jpg http://i42.tinypic.com/15x0pj5.jpg

我不太确定..您在 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;

这就是我在测试项目中所做的全部工作。

With 9pt: alt text

And with 14pt: alt text

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

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


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


As requested the screenshot: alt text

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Windows Ribbon Framework:如何更改字体和大小? 的相关文章

  • 如何使用 jQuery 和“长轮询”通过 Indy HTTP 服务器动态更新 HTML 页面?

    我读过这篇文章使用 JavaScript 和 jQuery 的简单长轮询示例 http techoctave com c7 posts 60 simple long polling example with javascript and j
  • :: 右侧的非法标记

    我有以下模板声明 template
  • Windows 8 SDK 中的 DirectX

    Summary 是否应该从针对 Windows 8 的应用程序中删除 directX 包含文件 Details 我是 Windows 开发新手 我正在尝试使用 Visual Studio 2012 如果可能 在 Windows 8 上编译
  • EIdOSSLUnderlyingCryptoError 和“使用 SSL 连接时出错。错误:14094410...”

    我在 OS X 上的 Delphi 10 1 Berlin 中遇到 Indy 组件问题 我正在使用TIdHTTP使用 HTTPS 连接到 Web 服务 问题是从 OS X 客户端连接到服务器 在 OS X 上运行时 我总是遇到同样的错误 P
  • 如何用C语言测量时间?

    我想知道某个代码块执行了多长时间 大约 像这样的事情 startStopwatch do some calculations stopStopwatch printf lf timeMesuredInSeconds How 您可以使用clo
  • 如何允许表单接受文件删除而不处理 Windows 消息?

    在 Delphi XE 中 我可以允许我的表单接受文件 拖放 但不必处理裸窗口消息吗 您不需要处理消息来实现这一点 你只需要实施IDropTarget并打电话RegisterDragDrop RevokeDragDrop 这真的非常非常简单
  • 使用API​​隐藏程序标题栏

    它可以使用 c 和 windows api 删除窗口控制台标题栏 如果是的话如何 请 这个简单的应用程序隐藏并显示其所在控制台的标题栏 它会立即将控制台标题更改为 guid 以查找窗口句柄 然后 它使用 ToggleTitleBar 使用找
  • Delphi - 将物理路径(设备文件句柄)转换为虚拟路径

    我怎样才能转换像这样的路径 设备 HarddiskVolume3 Windows 进入其相应的虚拟路径 如本例中的 c Windows 我个人更喜欢原生方式 function GetHDDDevicesWithDOSPath TString
  • 如何将 TGifImage 中的帧提取为位图?

    下面的演示尝试在表单的画布上绘制 GIF 这不起作用 图像不会前进 如何让它发挥作用 procedure TForm1 FormCreate Sender TObject begin GIF TGIFImage Create GIF Loa
  • 在 C# 中根据鼠标点击获取活动窗口名称

    我正在尝试使应用程序获取用户单击的窗口的鼠标单击位置和标题 名称 我目前使用的是 LowLevelMouseProc 它提供了良好的结果 但每当我单击 Google chrome 时 它 都会使应用程序崩溃 这是代码 using Syste
  • 检测反射 DLL 注入

    在过去的几年中 恶意软件 以及一些渗透测试工具 如 Metasploit 的 meterpreter 负载 已经开始使用反射 DLL 注入 PDF http www harmonysecurity com files HS P005 Ref
  • 以 png 格式剪辑幻灯片 (Delphi 2010)

    I have a filmstrip of images in png format like this 我想知道如何剪辑每个图像并将这些图像放入 TImageList 控件中 并始终保留透明度 EDIT 是的 在设计时 RRUZ 提到的技
  • 如何在 Windows 上查找当前系统缓存大小?

    到处搜索 但未能找到 API 调用来检索 Windows 上 文件 系统缓存的当前大小 全局内存状态Ex https stackoverflow com a 2017659 450917 检索总计 免费 已用和交换统计数据 获取系统文件缓存
  • Delphi中的抽象类

    我正在使用一个具有许多抽象类的组件套件 现在我想应用多态性 但在创建对象时收到错误抽象类 即使我不需要 我是否应该重写所有虚拟方法 有什么解决方法或解决方案吗 为了创建类的实例 您需要重写所有声明为虚拟抽象的方法 即使您不使用它们 如果您确
  • 如何在 WINAPI 中获取 Windows 10 内部版本、修订号?

    我想使用 WINAPI 在 Windows 10 上获取构建版本 当前窗口版本 10 0 19042 685 我尝试使用 WMI 查询来获取它 select Version BuildNumber from Win32 OperatingS
  • 在 Delphi 2007 中将具有透明度的位图保存为 PNG

    我有一个包含透明度信息的 Delphi 位图 32 位 我需要将其转换并保存为 PNG 文件 同时保留透明度 我目前拥有的工具是graphics32 Library GR32 PNG 由Christian Budde 提供 和PNGImag
  • VirtualAlloc 对齐方式与分配大小一致吗?

    当使用VirtualAlloc用于分配和提交具有页面边界的两倍大小的虚拟内存区域的 API 例如 void address VirtualAlloc 0 0x10000 MEM COMMIT PAGE READWRITE Get 64KB
  • 如何捕获正在播放的音频?

    有谁知道如何以编程方式捕获正在播放的声音 即来自声卡的所有声音 而不是麦克风等输入设备 假设您正在谈论 Windows 则基本上可以通过三种方法来实现此目的 首先是打开音频设备的主输出作为录音源 这只有在驱动程序支持时才可能实现 尽管现在大
  • 如何带参数调用外部程序?

    我想在我的代码中调用一个 Windows 程序 并使用代码本身确定的参数 我不想调用外部函数或方法 而是调用 WinXP 环境中的实际 exe 或批处理 脚本文件 C 或 C 将是首选语言 但如果使用任何其他语言更容易完成此操作 请告诉我
  • 具有自定义镶边的 WPF 窗口在右侧和底部有不需要的轮廓

    我使用 Microsoft Windows Shell dll 创建了带有自定义镶边的 WPF 窗口 这是代码

随机推荐