【发布时间】: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 代表,你可以添加它作为答案。
关键字: Windows Ribbon Framework,改变字体大小,UIRibbon,字体,ribbon ui,scenery ui,scenery ribbon,fluent 功能区,fluent ui,改变字体窗口功能区,uiribbon.h
Microsoft 有许多 Ribbon 实现:
- Windows Ribbon Framework - 原生
- CMFCRibbonBar for MFC - MFC
- Ribbon (WPF) - WPF
- ribbon.codeplex.com - 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。丝带……少了。
另见
【问题讨论】:
-
总是很高兴阅读您的闪亮问题。也许我会抽出时间来调查一下。
-
@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