10

WindowsリボンフレームワークのUIRibbonで使用されるフォント面とフォントサイズをどのように変更しますか?

リボンで使用されるフォントが、ユーザーがWindowsの設定として選択したフォントと一致しません。これは私のアプリケーションが使用する設定です。これは、Windowsのフォントが大きくなると、リボンが小さくなることを意味します。

各スクリーンショットでリボンがどのように小さくなるかに注意してください。

Segoe UI 9pt(Windowsのデフォルト)

代替テキスト

Segoe UI 12pt(私が使用しているもの)

代替テキスト

Segoe UI 16pt(お客様が使用するもの)

代替テキスト

16ptに達するまでに、リボンのテキストが非常に読みにくくなっていることがわかります。

バックグラウンド

ユーザーは、好みのフォントサイズを使用するようにWindowsを構成できます。例:

  • 8点
  • 9点
  • 12点

およびそれらの優先フォント面、例:

  • MSサンセリフ
  • Microsoftサンセリフ
  • タホマ
  • Segoe UI
  • Calibri

ただし、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設定を尊重する場合がありますが、それはこの質問ではありません。


Outlook2010で動作します

Outlook 2010のリボンは、ユーザーの(メニュー)フォント設定を尊重することに注意してください。次のコマンドを呼び出すと、ユーザーのメニューフォントを取得できます[SystemParametersInfo][6]

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

ncm.lfMenuFont <---

9pt Outlook 2010

代替テキスト

12pt Outlook 2010

代替テキスト

12pt Outlook 2010

代替テキスト

フォントサイズに応じてリボンのサイズが大きくなることに注意してください。(これは、これらのサイズ変更されたスクリーンショットでは、リボンが知覚的に小さくならないことを意味します。)

2つの可能性があります:

  • Outlook 2010は、Windowsリボンフレームワークでフォントサイズを調整する方法を知っています。
  • Outlook2010はWindowsリボンフレームワークを使用しません

Windows7ペイントが機能しない

また、Windows7のWindowsペイントはユーザーのフォント設定を尊重しないことに注意してください。これにより、(mspaint)はWindowsリボンフレームワークを使用し、Windowsリボンフレームワークはフォントサイズの設定をサポートしていないと思います。あなたが実際に助けようとして、ここまで読んだら、これが正しい答えであることに気付くでしょう:それは不可能です。したがって、無料の300担当者が必要な場合は、それを回答として追加します。

編集: Microsoftへのクロスポスト

キーワード: Windowsリボンフレームワーク、フォントサイズの変更、UIRibbon、フォントフェイス、リボンui、風光明媚なui、風光明媚なリボン、流暢なリボン、流暢なui、フォントウィンドウリボンの変更、uiribbon.h

Microsoftには、いくつかのリボン実装があります。


MSペイントはメニューのフォント設定を尊重しません

これは、構成済みのWindows 7メニューフォント設定が12ptで、msPaintが表示され、Outlook2010が比較のために表示されているスクリーンショットです。

代替テキスト


サンプルコード

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

これは、 14pt(96dpiマシン上)用に構成されたWindowsメニューフォントのスクリーンショットです。Outlook 2010は14ポイント、PhotoshopCS3は14ポイントです。リボンは...少ないです。

代替テキスト

も参照してください

4

3 に答える 3

3

Windows 7 Paintの動作に基づくと、これは不可能のようです。:)

于 2010-12-02T16:26:13.147 に答える
3

正確にはわかりません。DelphiでWindowsリボンフレームワークを使用していて、この奇妙な動作が発生しましたか?

フレームワークを使い始めたばかりですが、リボンは私の好みを尊重しています。

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ペイントをチェックしました。それはユーザーの好みを尊重します。したがって、私はあなたが何か間違ったことをしたか、本当に間違ったオプションを変更したと思います。


スクリーンショットのリクエストに応じて: 代替テキスト

同じことをしたようです。これはかなり奇妙です...

于 2010-12-03T09:49:36.247 に答える
2

あなたが実際に助けようとして、ここまで読んだら、これが正しい答えであることに気付くでしょう:それは不可能です。したがって、無料の300担当者が必要な場合は、それを回答として追加します。

私はそれを答えとして投稿することはできません(ジョージが最初にそこに入りました:))、そしてあなたはどうしても何らかの解決策が必要なようですので、私が解決するために与えることができる他の唯一の役立つ答えや提案を投稿します問題:別のリボンコントロールを使用してください。 Delphi独自の実装、または他のMicrosoftの実装の代わりにこの実装を使用している理由はわかりません。

2つのオプションは次のとおりです。

  • 内蔵のDelphiTRibbonコントロール。私はこれを公開されているアプリでは使用していませんが、私自身の小さな/テストプログラムで使用しており、場所によっては少しバグがあります。(たとえば、タイトルバーのショートカットバーで奇妙な描画の問題が発生しました。)これはDelphiXEで改善された可能性があります。同様のバグが発生している可能性があります。ただし、Delphiに同梱されており、Delphi、ネイティブコード、VCLがある場合は「無料」であり、VCLコンポーネントであることがソースに付属しているため、必要に応じて修正できます。

  • TMSリボンコントロール。私はそれを使用していませんが、別のTMSコントロールを使用しました。その制御は良好であり、それらのサポートはバグを迅速に修正します。(1日でバグが確認されたので、「すぐに」タイムゾーンをカウントし、数日で新しいビルドがリリースされました。)

他のコンポーネントベンダーがリボンコンポーネントを作成している可能性があると思います。リボンコントロールを含むSpTBXLibの変更を行っている人を読んだことを覚えていますが、それらについてはあまり聞いていません。私の提案は、TMSリボンを使用することです。

于 2010-12-03T04:03:55.183 に答える