Ленточная платформа Windows:Как изменить вид и размер шрифта?
-
27-09-2019 - |
Вопрос
Как изменить начертание и размер шрифта, используемые Ленточная платформа WindowsUIRibbon?
Шрифт, используемый лентой, не соответствует шрифту, который пользователь выбрал в настройках Windows — именно этот шрифт использует мое приложение.Это означает, что по мере увеличения шрифта в Windows лента становится меньше.
Обратите внимание, как лента становится меньше на каждом снимке экрана:
Segoe UI 9pt (по умолчанию в Windows)
Segoe UI 12pt (то, что я использую)
Segoe UI 16pt (используется клиентом)
Вы можете видеть, что к тому времени, когда мы доберемся до 16pt, текст на ленте станет довольно трудно читать.
Фон
Пользователь может настроить Windows для использования своих предпочтений. размер шрифта, например:
- 8пт
- 9пт
- 12пт
и их предпочтительные шрифт, например:
- MS без засечек
- Майкрософт без засечек
- Тахома
- Сегоэ пользовательский интерфейс
- Калибри
но Ленточная платформа Windows по умолчанию использует шрифт, который нет предпочтения пользователя.
Редактировать: Изображение перемещено вверх, чтобы поймать белок, которых привлекают блестящие предметы.
Редактировать 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
Заметили, что лента увеличивается в размере вместе с размером шрифта?(На этих скриншотах с измененным размером это означает, что лента не становится визуально меньше.)
Есть две возможности:
- 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 - родной
- CMFCRibbonBar для MFC - МФЦ
- Лента (WPF) - ВПФ
- лента.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 Меню шрифт настроен на 14 пт (на компьютере с разрешением 96 точек на дюйм).Outlook 2010 — 14 пт, Photoshop CS3 — 14 пт.Лента... меньше.
Смотрите также
Решение
Судя по поведению 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;
Это все, что я делаю в своем тестовом проекте.
С 9пт:
И с 14pt:
Возможно, вы меняете неправильный вариант?Я установил размер шрифта элемента «Меню».
Если у вас есть дополнительные вопросы, просто задавайте...
Я только что проверил Win7 Paint.Он уважает предпочтения пользователя.Поэтому я думаю, что вы сделали что-то не так или действительно изменили не ту опцию.
Как просил скриншот:
Похоже, мы сделали то же самое.Это довольно странно...
Если вы на самом деле попытались быть полезными, и прочитать здесь, вы поймете, что это правильный ответ:это невозможно.Так что, если вы хотите бесплатный 300 Rep, вы добавляете это в качестве ответа.
Поскольку я не могу опубликовать это в качестве ответа (Джордж пришел первым :)), и поскольку вам, кажется, отчаянно нужно какое-то решение, я собираюсь опубликовать только другой полезный ответ или предложение, которое я могу дать для решения вашей проблемы: используйте другой элемент управления лентой. Вы не говорите, почему вы используете эту реализацию вместо собственной реализации Delphi или даже одной из других реализаций Microsoft.
Два варианта:
А встроенный Delphi TRibbon контроль.Я не использовал это ни в каких общедоступных приложениях, но у меня есть свои небольшие/тестовые программы, и местами это немного глючит.(Например, я видел странные проблемы с рисованием на панели быстрого доступа в строке заголовка.) Это возможно, улучшилось в Delphi XE.возможно это страдает от похожей ошибки.Тем не менее, он поставляется с Delphi «бесплатно», если у вас есть Delphi, собственный код, VCL, и, являясь компонентом VCL, он поставляется с исходным кодом, поэтому вы можете исправить ситуацию при необходимости.
А Ленточное управление TMS.Я не использовал его, но я использовал еще один элемент управления TMS.Контроль хороший, а поддержка быстро исправляет ошибки.(Через день я получил подтверждение об ошибке, поэтому «сразу» подсчитываю часовые пояса, а новая сборка выйдет через несколько дней.)
Я считаю, что другие поставщики компонентов могут создавать ленточные компоненты, и я помню, как читал, что кто-то сделал модификацию SpTBXLib, содержащую элементы управления лентой, но я мало о них слышал.Мое предложение состоит в том, чтобы используйте ленту TMS.