Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

フォントラベルのHighDPI対応 #645

Merged
merged 2 commits into from
Nov 25, 2018

Conversation

berryzplus
Copy link
Contributor

@berryzplus berryzplus commented Nov 24, 2018

概要

#471 で上がってる問題の一つです。
#639 の対応を確認しようとしたら気になったので対応します。

対応の説明

選択したフォントをサイズ含めて表示するラベルの文字が、
HighDPI環境で小さくなる事象への対応です。

このラベルは、指定したフォントサイズに応じて文字が大きくなる仕様なんですが、
ダイアログではラベルサイズを動的に変えたりするのがめんどうなので
一定の大きさを超えたらそれ以上大きくしないようになっています。

フォントサイズの上限値がHighDPI対応してなかっために
強制的に小さなフォントで描画されてしまっていました。

上限値をHighDPI対応にすることでこの問題を回避します。
対応箇所は2か所ありますが、タイプ別設定のほうは該当箇所の表示方法が分かりませんでした

対応前後比較

ソース 初期表示
master 2018-11-24
this PR 2018-11-24 1
ソース 大きなフォントに設定時
master 2018-11-24 3
this PR 2018-11-24 2

タイプ別設定の出し方が分かったので追記

  1. タイプ別設定一覧で「基本」以外を選び、タイプ別設定を開く
  2. スクリーンタブの「フォント」ボタンを押してフォントを選ぶ
  3. フォントボタンの上にフォントラベルが表示される
    (思いっきり見切れてる件はこのPRで対応すべきなんだろうか・・・?)

選択したフォントをサイズ含めて表示するラベルの文字が、HighDPI環境で小さくなる事象への対応。
フォントサイズの上限値がHighDPI対応してなかっために強制的に小さなフォントで描画されていた。
上限値をHighDPI対応にすることでこの問題を回避する。
@beru
Copy link
Contributor

beru commented Nov 24, 2018

大きなフォントに設定時 ってどの版のOSでどういう操作をしたのか教えてもらえますか?

共通設定のプロパティシートのタブの一番下が半分くらい切れて表示されているのは一体…。

// 大きすぎるフォントは小さく表示
if( lfTemp.lfHeight < -16 ){
lfTemp.lfHeight = -16;
int limitSize = DpiScaleY( 16 );
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

DpiScaleY の実装はこうなっていて、

inline int DpiScaleY(int y){return CDPI::ScaleY(y);}

CDPI::ScaleY の実装はこうなっていますが、

static int ScaleY(int y){Init(); return ::MulDiv(y, nDpiY, 96);}

LOGFONT::lfHeight の値って、

lfHeight = -MulDiv(PointSize, GetDeviceCaps(hDC, LOGPIXELSY), 72);

こういうように設定するようにドキュメントに書かれているので画面座標のDPI対応で使う 96 という数値がフォントの場合にも適用できるか心配です。

しかし 96 とか 72 とか経緯が不明です…。
https://en.wikipedia.org/wiki/Dots_per_inch#Computer_monitor_DPI_standards
に書かれてそうなのですが tl;dr: です…。

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

こういうように設定するようにドキュメントに書かれているので画面座標のDPI対応で使う 96 という数値がフォントの場合にも適用できるか心配です。

その辺こだわりなかったので純粋に比率で拡大するようにしました。

72とか96とかについては、前にここで書いてます。
#471 (comment)

この数式を使う場合は、引数のnpsを渡して算出してやる形になるのかな、と思います。

lfHeight = -MulDiv(PointSize, GetDeviceCaps(hDC, LOGPIXELSY), 72);

・・・この数式ってポイントサイズ⇒ピクセルサイズの変換式じゃないですかね?
ポイントという単位は 72 が関係する単位だったと思います。
ちょっと調べてみます。

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

https://ja.wikipedia.org/wiki/ポイント

1 pt = 1/72 in. (= 25.4/72 mm = 0.352 777 7... mm)

とありました。

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

https://opentype.jp/pointdot.htm

1ポイントは1/72インチに相当します。(1/72は72分の1を現します。)

という事なのでフォントの場合は 96 より 72 を使ってあげた方が良いと思います。

@berryzplus
Copy link
Contributor Author

大きなフォントに設定時 ってどの版のOSでどういう操作をしたのか教えてもらえますか?

テストは windows 10 pro 1803 でフォントサイズ200%にした状態で行っています。
変わったことというと、表示言語が en です。
大きなフォントにしたは、キーワードヘルプのフォントボタンで72ptを選択しただけです。

共通設定のプロパティシートのタブの一番下が半分くらい切れて表示されているのは一体…。

これは気付いていませんでした。
別の問題が見つかった感じだと思います。

@beru
Copy link
Contributor

beru commented Nov 24, 2018

しかしキーワードヘルプに使うフォントのラベル表示ですが、指定したフォントでダイアログ内に描画するというのがそもそも 仕様 なのかどうか不明です。表示領域(Group-box Control)の縦幅に収まるように制限を掛けているようですが…。

ダイアログ内ではどのフォントを選択したかを文言で表示するだけにしておいて、わざわざ指定したフォントで描画まではしなくて良いんじゃないかなぁと思ってしまいます…。

@beru
Copy link
Contributor

beru commented Nov 24, 2018

大きなフォントに設定時 ってどの版のOSでどういう操作をしたのか教えてもらえますか?

テストは windows 10 pro 1803 でフォントサイズ200%にした状態で行っています。
変わったことというと、表示言語が en です。
大きなフォントにしたは、キーワードヘルプのフォントボタンで72ptを選択しただけです。

表示言語が en というのは、Windows の表示言語が、って事ですかね。

共通設定のプロパティシートのタブの一番下が半分くらい切れて表示されているのは一体…。

これは気付いていませんでした。
別の問題が見つかった感じだと思います。

4枚のスクリーンショットのうち、2枚目以降で発生しています。

@berryzplus
Copy link
Contributor Author

2013年当時・・・ぶっちゃけこの頃は勝手にやってる雰囲気です。

@beru
Copy link
Contributor

beru commented Nov 24, 2018

Windows の表示言語を English (United States) にして確認しましたがタブが見切れるのは再現しませんでした。スクリーンショットの問題なのか、それとも表示倍率を変えてからサインアウトしていないと起きてしまうとかなんでしょうか…?

@berryzplus
Copy link
Contributor Author

表示言語が en というのは、Windows の表示言語が、って事ですかね。

そうです。

Windows の表示言語を English (United States) にして確認しましたがタブが見切れるのは再現しませんでした。スクリーンショットの問題なのか、それとも表示倍率を変えてからサインアウトしていないと起きてしまうかなんでしょうか…?

いまやると見切れない・・・

固定値16ptをlfHeightと直接比較するのをやめ、DPI変換した値で比較する。lfHeightの値は既にDPI変換されているので修正箇所は16ptのほうだけ。
@berryzplus
Copy link
Contributor Author

berryzplus commented Nov 24, 2018

拡大方法をフォントの72基準で組みなおしてみました。
lf.lfHeightに入ってくる高さがpt⇒px変換した値と一致するようなので、
こちらのアプローチが正しかったようです。

共通設定 初期表示
this PR 2018-11-24 5
共通設定 大きなフォントに設定時
this PR 2018-11-24 6

おまけ:タイプ別設定

タイプ別設定に普通なフォントを設定した時
2018-11-24 8

タイプ別設定に大きなフォントを設定した時
2018-11-24 9

タイプ別設定の見切れっぷりはもう、見えるからいいよね、なノリで見逃してほしいです。
これたぶん、HighDPI以前に表示スペース足りてない気がするので。

共通設定タブの見切れはなんだったんだろう・・・。

Copy link
Contributor

@beru beru left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

動作確認してみました。問題無いと思います。

@berryzplus berryzplus merged commit 5ab042a into sakura-editor:master Nov 25, 2018
@berryzplus berryzplus deleted the feature/dpi_font_label branch November 25, 2018 06:13
@m-tmatma m-tmatma added this to the next release milestone Dec 1, 2018
@beru beru mentioned this pull request Dec 2, 2018
11 tasks
HoppingTappy pushed a commit to HoppingTappy/sakura that referenced this pull request Jun 11, 2019
…_label

フォントラベルのHighDPI対応
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants