Windows Ribbon Framework: Как изменить шрифт и размер шрифта? - PullRequest
9 голосов
/ 17 апреля 2010

Как изменить лицо и размер шрифта, используемые Windows Ribm Framwork UIRibbon?

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

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

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

alt text

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

alt text

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

alt text

К тому моменту, когда мы добираемся до 16pt, вы можете видеть, что текст на ленте довольно труден для чтения.

Фон

Пользователь может настроить Windows на использование предпочтительного размера шрифта , например ::

.
  • 8pt
  • 9пт
  • 12pt

и их предпочитаемый шрифт , например ::1010 *

  • 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

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 Ribbon Framework 14pt! = 14pt

Вот снимок экрана со шрифтом Windows Menu , настроенным для 14pt (на машине с разрешением 96 точек на дюйм). Outlook 2010 14pt, Photoshop CS3 14pt. Лента ... меньше.

alt text

Смотри также

Ответы [ 3 ]

3 голосов
/ 03 декабря 2010

Я не совсем уверен .. Вы используете 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: alt text

И с 14pt: alt text

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

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


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


По запросу скриншот: alt text

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

3 голосов
/ 02 декабря 2010

В зависимости от поведения Windows 7 Paint это представляется невозможным. :)

2 голосов
/ 03 декабря 2010

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

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

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

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

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

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

...