如何更改Windows Ribbon Framework的UIRibbon使用的字体和字号?
该功能区所使用的字体与用户选择为其Windows首选项的字体不匹配 - 这也是我的应用程序所使用的首选项。这意味着随着Windows中的字体变得越来越大,功能区会变得越来越小。
请注意每个截图中功能区都变得越来越小:
Segoe UI 9pt(Windows默认)
Segoe UI 12pt(我使用的字体)
Segoe UI 16pt(客户所使用的字体)
当字体大小达到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 颜色方案相匹配:
但我找不到更改字体/大小的选项。注意:尽管功能区可能会遵循用户的 DPI 设置,但这不是这个问题。
在Outlook 2010中可用
值得注意的是,Outlook 2010的功能区确实遵循用户(菜单)字体偏好设置。您可以通过调用[SystemParametersInfo][6]
来获取用户的菜单字体:
SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm, 0));
ncm.lfMenuFont <---
9pt Outlook 2010
12pt Outlook 2010
12pt Outlook 2010
有两种可能性:
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 有许多功能区实现:
- 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 Ribbon Framework的14pt并不等于14pt
这是一张截图,Windows菜单字体配置为14pt(在96dpi的机器上)。Outlook 2010和Photoshop CS3都是14pt,而Ribbon则更小。
TRibbon
是一个完全自定义的控件,完全由Delphi代码编写。因此,它不包装任何Microsoft控件。 - Andreas Rejbrand