Windows Ribbon Framework: Как изменить шрифт и размер шрифта?
Как изменить начертание шрифта и размер шрифта, используемые UIRibbon в Windows Ribbon Framwork?
Шрифт, используемый на ленте, не совпадает со шрифтом, выбранным пользователем в качестве своих предпочтений Windows - это предпочтение, которое использует мое приложение. Это означает, что когда шрифт в Windows становится больше, лента становится меньше.
Обратите внимание, как лента становится меньше на каждом скриншоте:
Segoe UI 9pt (по умолчанию в Windows)
Segoe UI 12pt (что я использую)
Segoe UI 16pt (какой клиент использует)
Вы можете видеть, что к тому времени, когда мы перейдем к 16pt, текст на ленте будет довольно трудно читать.
Фон
Пользователь может настроить Windows для использования своего предпочтительногоразмера шрифта, например:
- 8pt
- 9пт
- 12pt
и предпочитаемый имишрифт, например:
- MS Sans Serif
- Microsoft без засечек
- 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:
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
12pt Outlook 2010
12pt Outlook 2010
Заметьте, лента увеличивается в размере с размером шрифта? (Что на этих скриншотах с измененным размером означает, что лента не становится перцепционно меньше).
Есть две возможности:
- Outlook 2010 знает, как настроить размер шрифта в Windows Ribbon Framework
- Outlook 2010 не использует Windows Ribbon Framework
Windows 7 Paint не работает
Также полезно отметить, что Windows Paint в Windows 7 не учитывает настройки шрифта пользователя. Это наводит меня на мысль, что он (mspaint) использует Windows Ribbon Framework и что Windows Ribbon Framework не поддерживает установку размера шрифта. Если вы на самом деле пытались быть полезными и читали до конца, вы поймете, что это правильный ответ: это невозможно. Поэтому, если вы хотите получить 300 повторений, вы добавляете это как ответ.
Изменить: кросс-пост в Microsoft
Ключевые слова: Windows Ribbon Framework, изменение размера шрифта, UIRibbon, лицо шрифта, интерфейс ленты, живописный интерфейс, сценическая лента, свободная лента, свободный интерфейс, изменение шрифта для ленты windows, uiribbon.h
Microsoft имеет ряд реализаций ленты:
- Windows Ribbon Framework - родной
- CMFCRibbonBar для MFC - MFC
- Лента (WPF) - WPF
- http://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 (на машине с разрешением 96 точек на дюйм). Outlook 2010 14pt, Photoshop CS3 14pt. Лента... меньше.
Смотрите также
3 ответа
В зависимости от поведения Windows 7 Paint это представляется невозможным.:)
Я не совсем уверен.. Вы используете Windows Ribbon Framework в Delphi и получили это странное поведение?
Я только начал играть с Framework, но Ribbon уважает мои предпочтения.
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:
И с 14pt:
Возможно, вы изменили неправильный вариант? Я установил размер шрифта элемента "Меню".
Если у вас есть дополнительные вопросы, просто спросите...
Я только что проверил Win7 Paint. Это уважает пользовательские настройки. Поэтому я думаю, что вы сделали что-то не так или действительно изменили неправильный вариант.
Как и просили скриншот:
Похоже, мы сделали то же самое. Это довольно странно...
Если вы на самом деле пытались быть полезными и читали до конца, вы поймете, что это правильный ответ: это невозможно. Поэтому, если вы хотите получить 300 повторений, вы добавляете это как ответ.
Поскольку я не могу опубликовать это как ответ (Джордж попал туда первым:)), и, поскольку вам, похоже, крайне необходимо какое-то решение, я собираюсь опубликовать единственный другой полезный ответ или предложение, которое я могу дать, чтобы решить Ваша проблема: используйте другой элемент управления ленты. Вы не говорите, почему вы используете эту реализацию вместо собственной Delphi или даже одной из других версий Microsoft.
Два варианта:
Встроенный Delphi TRibbon control. Я не использовал это ни в каких общедоступных приложениях, но у меня есть в моих маленьких / тестовых программах, и это местами немного глючит. (Например, я видел странные проблемы с рисованием на панели быстрого доступа в строке заголовка.) Это могло быть улучшено в Delphi XE. Возможно, он страдает от подобной ошибки. Тем не менее, он поставляется с Delphi, "бесплатным", если у вас есть Delphi, нативный код, VCL, а компонент VCL поставляется с исходным кодом, так что вы можете исправить вещи при необходимости.
Контроль ленты TMS. Я не использовал его, но я использовал другой элемент управления TMS. Этот контроль хорош, и их поддержка быстро исправляет ошибки. (У меня было подтверждение ошибки через день, поэтому "немедленно" подсчитываем часовые пояса, а новая сборка выпускается через несколько дней.)
Я полагаю, что другие поставщики компонентов могут создавать ленточные компоненты, и я помню, как читал о ком-то, кто делал модификацию SpTBXLib, содержащую ленточные элементы управления, но я мало что о них слышал. Мое предложение состоит в том, чтобы использовать ленту TMS.