Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
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行目にも似た処理がありますが、そちらは修正不要でしょうか。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
問題の発生原因が「矩形を更新してるから」なので、そこだけ対処しています。
188行目のコードは、CTipWndのサイズを確定させるコードです。こちらは「矩形を更新する」で正しいです。
これは試していないです。
描画対象が0文字な場合、高さが返らないんじゃなかったかな?と。(テキトー
ややめんどくさいんですが、コメントは合っています。
DrawTextは描画した文字列の高さを返す仕様で、nHeightに高さを取得してるのは間違いないので。
ただ、フォントを変えずに空行の高さが変わる事態はありえないので、毎回再計算するのではなく、一度だけ計算して以降は計算済みの値を使いまわすロジックにするのがベターだと思います。
それしないと不具合直らないわけじゃないっす!
というのが言い訳です:smiley:
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
原因に対する対処だけじゃダメでしょうか・・・?
There was a problem hiding this comment.
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が縮小されてしまい、それを次の描画領域として渡すことでそれ以降何も描画されなかったということですね。ここは
DT_CALCRECT
ではなく、DT_CALCRECT | DT_EXTERNALLEADING
とすべきではないかという指摘でした。(私の環境ではどちらもたまたま同じ値が返ってきているようですが。)試してみましたが、問題なく動きました。なので if で分岐する必要はないと思います。
ダミー文字列などというものは出来れば使いたくないところです。
処理が複雑になるだけの早すぎる最適化だとおもいます。
最適化のポイントは、第1は最適化しない、次が測定するですので。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
とはいえ、#647 以前からブランクかどうかで処理を分けていたのか。
There was a problem hiding this comment.
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
以前のコードを見直してみましたが、ブランクかどうかで処理を分けてはいますが、フラグは全く同じになっていますね。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
その通りだと思います。
では、ダミー文字列は廃止する方向で行きたいです。
ダミー文字列を使わない方向にするなら、ここの考慮は要らなくなりそうです。
既に最適化されてしまっているコードをどうするか?
ってところが、既存を触るときにめんどくさいポイントだと思います。不具合に対処したい
と良くないロジックを改善したい
は別な軸の話だと思うので、できれば別PRで対応したいです。There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ああ、188行目は修正しときます。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
okです。
ダミー文字列を使わないようにするかどうかは可能であれば実測して判断したいところです。