Вопрос

Как изменить начертание и размер шрифта, используемые Ленточная платформа WindowsUIRibbon?

Шрифт, используемый лентой, не соответствует шрифту, который пользователь выбрал в настройках Windows — именно этот шрифт использует мое приложение.Это означает, что по мере увеличения шрифта в Windows лента становится меньше.

Обратите внимание, как лента становится меньше на каждом снимке экрана:

Segoe UI 9pt (по умолчанию в Windows)

alt text

Segoe UI 12pt (то, что я использую)

alt text

Segoe UI 16pt (используется клиентом)

alt text

Вы можете видеть, что к тому времени, когда мы доберемся до 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:

alt text

Но я не могу найти возможность изменить вид/размер шрифта.

Примечание: Пока лента может соблюдайте настройки DPI пользователя, это не так этот вопрос.


Это работает в Outlook 2010

Возможно, было бы полезно отметить, что лента Outlook 2010 учитывает предпочтения шрифта пользователя (меню).Вы можете получить шрифт меню пользователя, вызвав [SystemParametersInfo][6]:

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

ncm.lfMenuFont <---

9pt Outlook 2010

alt text

12pt Outlook 2010

alt text

12pt Outlook 2010

alt text

Заметили, что лента увеличивается в размере вместе с размером шрифта?(На этих скриншотах с измененным размером это означает, что лента не становится визуально меньше.)

Есть две возможности:

  • 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 есть несколько реализаций ленты:


MS Paint не учитывает предпочтения шрифта меню

Вот скриншот, показывающий мою настроенную Windows 7. Шрифт меню настройка 12pt, при этом отображается msPaint и Outlook 2010 для сравнения.

alt text


Образец кода

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 пт.Лента... меньше.

alt text

Смотрите также

Это было полезно?

Решение

Судя по поведению 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пт:alt text

И с 14pt:alt text

Возможно, вы меняете неправильный вариант?Я установил размер шрифта элемента «Меню».

Если у вас есть дополнительные вопросы, просто задавайте...


Я только что проверил Win7 Paint.Он уважает предпочтения пользователя.Поэтому я думаю, что вы сделали что-то не так или действительно изменили не ту опцию.


Как просил скриншот:alt text

Похоже, мы сделали то же самое.Это довольно странно...

Если вы на самом деле попытались быть полезными, и прочитать здесь, вы поймете, что это правильный ответ:это невозможно.Так что, если вы хотите бесплатный 300 Rep, вы добавляете это в качестве ответа.

Поскольку я не могу опубликовать это в качестве ответа (Джордж пришел первым :)), и поскольку вам, кажется, отчаянно нужно какое-то решение, я собираюсь опубликовать только другой полезный ответ или предложение, которое я могу дать для решения вашей проблемы: используйте другой элемент управления лентой. Вы не говорите, почему вы используете эту реализацию вместо собственной реализации Delphi или даже одной из других реализаций Microsoft.

Два варианта:

  • А встроенный Delphi TRibbon контроль.Я не использовал это ни в каких общедоступных приложениях, но у меня есть свои небольшие/тестовые программы, и местами это немного глючит.(Например, я видел странные проблемы с рисованием на панели быстрого доступа в строке заголовка.) Это возможно, улучшилось в Delphi XE.возможно это страдает от похожей ошибки.Тем не менее, он поставляется с Delphi «бесплатно», если у вас есть Delphi, собственный код, VCL, и, являясь компонентом VCL, он поставляется с исходным кодом, поэтому вы можете исправить ситуацию при необходимости.

  • А Ленточное управление TMS.Я не использовал его, но я использовал еще один элемент управления TMS.Контроль хороший, а поддержка быстро исправляет ошибки.(Через день я получил подтверждение об ошибке, поэтому «сразу» подсчитываю часовые пояса, а новая сборка выйдет через несколько дней.)

Я считаю, что другие поставщики компонентов могут создавать ленточные компоненты, и я помню, как читал, что кто-то сделал модификацию SpTBXLib, содержащую элементы управления лентой, но я мало о них слышал.Мое предложение состоит в том, чтобы используйте ленту TMS.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top