mfc ribbon动态修改字符,Windows Ribbon框架:如何更改字体和大小?

How do you change the font face and font size used by the Windows Ribbon Framwork's UIRibbon?

The font used by the ribbon does not match the font the user has chosen as their Windows preferences - which is the preference my application uses. This means that as the font in Windows gets bigger, the ribbon gets smaller.

Notice how the ribbon gets smaller in each screenshot:

Segoe UI 9pt (Windows default)

3E2g5.png

Segoe UI 12pt (what i use)

RLvHl.png

Segoe UI 16pt (what customer's use)

eNJ6V.png

You can see by the time we get to 16pt, the text on the ribbon is quite hard to read.

Background

The user can configure Windows to use their preferred font size, e.g.:

8pt

9pt

12pt

and their preferred font face, e.g.:

MS Sans Serif

Microsoft Sans Serif

Tahoma

Segoe UI

Calibri

but the Windows Ribbon Framework by default uses a font that is not the user's preference.

Edit: Moved picture up top to catch squirrels attracted by shiny things.

Edit 2: Added another colorful picture, to get a bump.

Edit 3: Editing to get a bump

Edit 4: Adding another different picture to get a bump

The ribbon does allow customizing the colors of the ribbon.

The following code fragment is used to set the UI_PKEY_GlobalBackgroundColor of the ribbon. In this case i use a color that is the user's currently select Aero color scheme:

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;

And now the ribbon is now colored to match the color scheme of Windows:

But i can't find the option to change the font face/size.

Note: While the ribbon may honor the user's DPI settings, that isn't this question.

It works in Outlook 2010

It might be helpful to note that Outlook 2010's ribbon does honor the user's (menu) font preferences. You can get the user's menu font by calling [SystemParametersInfo][6]:

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

ncm.lfMenuFont

9pt Outlook 2010

PVx00.png

12pt Outlook 2010

sgCgB.png

12pt Outlook 2010

qSzs5.png

Notice the ribbon increases in size with the font size? (Which, in these resized screenshots, means that the ribbon does not get perceptually smaller.)

There are two possibilities:

Outlook 2010 knows how to adjust the font size in the Windows Ribbon Framework

Outlook 2010 does not use the Windows Ribbon Framework

Windows 7 Paint doesn't work

It's also useful to note that Windows Paint in Windows 7 does not honor the user's font preferences. This leads me to believe that it (mspaint) does use the Windows Ribbon Framework, and that the Windows Ribbon Framework doesn't support setting a font size. If if you've actually tried to be helpful, and read all the way down to here, you'll realize this is the correct answer: it's not possible. So if you want a free 300 rep, you add that as an answer.

Keywords: Windows Ribbon Framework, change font size, UIRibbon, font face, ribbon ui, scenic ui, scenic ribbon, fluent ribbon, fluent ui, change font windows ribbon, uiribbon.h

Microsoft has a number of Ribbon implementations:

MS Paint doesn't honor menu font preference

Here's a screenshot showing my configured Windows 7 Menu Font setting of 12pt, with msPaint visible, and Outlook 2010 visible for comparison.

ncwSr.png

Sample Code

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

Here is a screenshot with Windows Menu font configured for 14pt (on a 96dpi machine). Outlook 2010 is 14pt, Photoshop CS3 is 14pt. The Ribbon is...less.

w9BGy.png

See also

解决方案

Based on the behavior of Windows 7 Paint, this appears to not be possible. :)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值