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

空行描画のオプションが誤っているのを修正する。 #1358

Merged
merged 2 commits into from
Aug 2, 2020

Conversation

berryzplus
Copy link
Contributor

PR の目的

空行描画のオプションが誤っているのが原因で起きている不具合を修正します。

カテゴリ

  • 不具合修正

PR の背景

#1353 OSDN転載: キーワードヘルプで複数行の説明テキストを入れると2行目以降が表示されない。

キーワードヘルプを表示させたときに、1行目しか表示されていません。

PR のメリット

PR のデメリット (トレードオフとかあれば)

仕様・動作説明

テスト内容

改修効果確認のテストを行います。

テスト1

手順

  1. バッチファイルを開きます。持ってない人は build-sln.bat とかを使えばいいと思います。
  2. 設定 ⇒ タイプ別設定 を開き、キーワードヘルプタブをこんな感じに設定します。
  3. 設定 ⇒ キーワードヘルプを自動表示する をクリックして自動表示を有効にします。
  4. set にマウスカーソルを当てます。

説明テキストの2行目以降が表示されていたらOKです。

PR の影響範囲

複数行の説明テキストを含むキーワードヘルプファイルを使う場合の挙動に影響します。

関連 issue, PR

fixes #1353 OSDN転載: キーワードヘルプで複数行の説明テキストを入れると2行目以降が表示されない。
#647 辞書Tipの描画改善、およびHighDPI対応

参考資料

@berryzplus berryzplus added the 🐛bug🦋 ■バグ修正(Something isn't working) label Jul 31, 2020
@AppVeyorBot
Copy link

Comment on lines 259 to +260
// ダミー文字列の高さを取得する
nHeight = ::DrawText( hdc, szDummy, _countof(szDummy) - 1, &rc, DT_CALCRECT );
nHeight = ::DrawText( hdc, szDummy, _countof(szDummy) - 1, &rc, DT_EXTERNALLEADING );
Copy link
Member

Choose a reason for hiding this comment

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

DT_CALCRECT | DT_EXTERNALLEADING でサイズを計算するだけではなく、実際に描画しないとダメなのでしょうか。
そうだとするとコメントも修正すべきだと思います。
しかし、文字列がブランクの場合も描画が必要となると、253行目の if 文で分岐する必要はあるのでしょうか。DrawText に長さ 0 を渡すとダメなんでしたっけ。

188行目にも似た処理がありますが、そちらは修正不要でしょうか。

Copy link
Contributor Author

@berryzplus berryzplus Aug 1, 2020

Choose a reason for hiding this comment

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

問題の発生原因が「矩形を更新してるから」なので、そこだけ対処しています。

188行目にも似た処理がありますが、そちらは修正不要でしょうか。

188行目のコードは、CTipWndのサイズを確定させるコードです。こちらは「矩形を更新する」で正しいです。

しかし、文字列がブランクの場合も描画が必要となると、253行目の if 文で分岐する必要はあるのでしょうか。DrawText に長さ 0 を渡すとダメなんでしたっけ。

これは試していないです。
描画対象が0文字な場合、高さが返らないんじゃなかったかな?と。(テキトー

DT_CALCRECT | DT_EXTERNALLEADING でサイズを計算するだけではなく、実際に描画しないとダメなのでしょうか。
そうだとするとコメントも修正すべきだと思います。

ややめんどくさいんですが、コメントは合っています。
DrawTextは描画した文字列の高さを返す仕様で、nHeightに高さを取得してるのは間違いないので。

ただ、フォントを変えずに空行の高さが変わる事態はありえないので、毎回再計算するのではなく、一度だけ計算して以降は計算済みの値を使いまわすロジックにするのがベターだと思います。

それしないと不具合直らないわけじゃないっす!
というのが言い訳です:smiley:

Copy link
Contributor Author

Choose a reason for hiding this comment

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

原因に対する対処だけじゃダメでしょうか・・・?

Copy link
Member

Choose a reason for hiding this comment

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

ちょっと勘違いしてました。DT_CALCRECT を指定していると描画はせずに、描画に必要なrectを計算しますが、DT_CALCRECT を指定しない場合は実際に描画された領域に合わせてrectを更新するわけではないのですね。
で、今回の不具合は、ダミー文字列に対して DT_CALCRECT を指定することで、rectが縮小されてしまい、それを次の描画領域として渡すことでそれ以降何も描画されなかったということですね。

188行目のコードは、CTipWndのサイズを確定させるコードです。こちらは「矩形を更新する」で正しいです。

ここは DT_CALCRECT ではなく、DT_CALCRECT | DT_EXTERNALLEADING とすべきではないかという指摘でした。(私の環境ではどちらもたまたま同じ値が返ってきているようですが。)

これは試していないです。
描画対象が0文字な場合、高さが返らないんじゃなかったかな?と。(テキトー

試してみましたが、問題なく動きました。なので if で分岐する必要はないと思います。
ダミー文字列などというものは出来れば使いたくないところです。

ただ、フォントを変えずに空行の高さが変わる事態はありえないので、毎回再計算するのではなく、一度だけ計算して以降は計算済みの値を使いまわすロジックにするのがベターだと思います。

処理が複雑になるだけの早すぎる最適化だとおもいます。
最適化のポイントは、第1は最適化しない、次が測定するですので。

Copy link
Member

Choose a reason for hiding this comment

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

とはいえ、#647 以前からブランクかどうかで処理を分けていたのか。

Copy link
Member

Choose a reason for hiding this comment

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

https://github.com/berryzplus/sakura/blob/6ae553a3d1eb2d100afc36996dd85e27a1c97e77/sakura_core/window/CTipWnd.cpp
以前のコードを見直してみましたが、ブランクかどうかで処理を分けてはいますが、フラグは全く同じになっていますね。

Copy link
Contributor Author

Choose a reason for hiding this comment

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

ここは DT_CALCRECT ではなく、DT_CALCRECT | DT_EXTERNALLEADING とすべきではないかという指摘でした。(私の環境ではどちらもたまたま同じ値が返ってきているようですが。)

その通りだと思います。

これは試していないです。
描画対象が0文字な場合、高さが返らないんじゃなかったかな?と。(テキトー

試してみましたが、問題なく動きました。なので if で分岐する必要はないと思います。
ダミー文字列などというものは出来れば使いたくないところです。

では、ダミー文字列は廃止する方向で行きたいです。

ただ、フォントを変えずに空行の高さが変わる事態はありえないので、毎回再計算するのではなく、一度だけ計算して以降は計算済みの値を使いまわすロジックにするのがベターだと思います。

処理が複雑になるだけの早すぎる最適化だとおもいます。
最適化のポイントは、第1は最適化しない、次が測定するですので。

ダミー文字列を使わない方向にするなら、ここの考慮は要らなくなりそうです。
既に最適化されてしまっているコードをどうするか?ってところが、既存を触るときにめんどくさいポイントだと思います。

不具合に対処したい良くないロジックを改善したいは別な軸の話だと思うので、できれば別PRで対応したいです。

Copy link
Contributor Author

Choose a reason for hiding this comment

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

ああ、188行目は修正しときます。

Copy link
Member

Choose a reason for hiding this comment

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

不具合に対処したい良くないロジックを改善したいは別な軸の話だと思うので、できれば別PRで対応したいです。

okです。
ダミー文字列を使わないようにするかどうかは可能であれば実測して判断したいところです。

@k-takata
Copy link
Member

k-takata commented Aug 2, 2020

今回の件とは別件ですが、148行目で ::GetSystemMetrics( SM_CXSCREEN ) でスクリーンの幅を使ってるのは、マルチモニター環境だと正しく動かない気がしました。

@berryzplus
Copy link
Contributor Author

今回の件とは別件ですが、148行目で ::GetSystemMetrics( SM_CXSCREEN ) でスクリーンの幅を使ってるのは、マルチモニター環境だと正しく動かない気がしました。

残念ながら、 マルチモニタでは正しく動かない という仕様だと思っています。
正確にはDPIの異なる複数のモニタがある環境では正しく動かないっす。DPIが同じなら動きます・・・。

その辺の対応を進める前にエディタ部分のレイアウト機構をなんとかしたい思惑があって、PerMonitorの件は後回しなのかなぁと思っています。対応するならこれ使わないといけないはず。
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getsystemmetricsfordpi

@AppVeyorBot
Copy link

@k-takata
Copy link
Member

k-takata commented Aug 2, 2020

正確にはDPIの異なる複数のモニタがある環境では正しく動かないっす。DPIが同じなら動きます・・・。

DPIが同じでも幅が異なるとおかしなことになると思います。PerMoniter DPIとは別の話です。

@k-takata
Copy link
Member

k-takata commented Aug 2, 2020

azpがfailしてるのは、chmで2回連続落ちてるのか…。リトライ回数増やすべきだろうか?

@berryzplus
Copy link
Contributor Author

レビューありがとうございます。マージしちゃいます。

@berryzplus berryzplus merged commit d3a1a8e into sakura-editor:master Aug 2, 2020
@berryzplus berryzplus deleted the feature/fix_draw_option branch August 2, 2020 06:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
🐛bug🦋 ■バグ修正(Something isn't working)
Projects
None yet
3 participants