-
Notifications
You must be signed in to change notification settings - Fork 167
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
補完候補一覧ダイアログの不具合修正 #1750
補完候補一覧ダイアログの不具合修正 #1750
Conversation
補足:
|
✅ Build sakura 1.0.3968 completed (commit b45144f8f2 by @kazasaku) |
このPRとは全く関係無いんですが、久しぶりにブランチをpullしてローカルで
いつもここらへんを気にしていなかったのでびっくりしました。 |
Kudos, SonarCloud Quality Gate passed! |
✅ Build sakura 1.0.3969 completed (commit 7a953bf713 by @kazasaku) |
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.
#1749 で報告された問題が解消された事を確認しました。
nWidth - rc.left * 2, | ||
nHeight - rc.top * 2/* - 20*/, | ||
nClientWidth - rc.left * 2, | ||
nClientHeight - rc.top * 2/* - 20*/, |
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.
「/* - 20*/」ってなんですかね?
「これって何ですか?食べられますか?」がムダな質問なら、
削ってしまうのが環境にやさしいと思います。(対応不要)
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.
自分も不思議に思ったので調べてみました。そもそも * 2
しているのもどうしてだかよくわかりません。gitのlogを見ると、CHokanMgr::OnSize
の処理内容は 2000/11/07 の genta さんのコミット b5555ab の時点で既にこうなっていました。
クラス名の CHokanMgr
からこのクラスがダイアログだという事が想像しにくいですが、ダイアログリソース IDD_HOKAN
をリソースエディタで見てみると、リストボックス IDC_LIST_WORDS
が存在しました。
ここではforループで配列の要素数分回していますが、配列の要素数は固定で1要素なのでループにする意味は無いように思えます。将来的にダイアログのコントロールの数が増えた場合に対応がしやすいコードにしていたのかもしれないですね。
ループの中の処理は
GetWindowRect
でウィンドウ領域のスクリーン座標を取得ScreenToClient
を2回呼び出して左上と右下の位置をクライアント座標に変換SetWindowPos
を呼んでリストボックスの位置をクライアント座標で設定し、サイズは親ダイアログのクライアント領域のサイズに設定
です。デバッグ実行して確認すると、リストボックスの左上のクライアント座標は 0,0 になっています。なので、ここで * 2
をする意味も無いように思えます。左上が 0,0 でコントロールの横幅と高さをクライアント領域の横幅と高さにするというのは、クライアント領域めいっぱいに広げるという事でしょうか。それが目的ならわざわざこういう記述にする必要は無い気もしますが、書いた人は何か理由があってこういう書き方にしたのかもしれないですね。
あと余談ですが + 4
, - 3
, - 4
している記述もあります。どういう目的での調整なのか自分には読み取れません。
しかし補完候補の一覧が機能しないというのは結構重大な問題ですね。自分が不具合を入れてしまいましたが、報告してくれたusagishitaさんと修正してくれたkazasakuさんのお陰で問題が解消されそうです。ありがとうございます。
nWidth = rcDlg.right - rcDlg.left; // width of client area | ||
nHeight = rcDlg.bottom - rcDlg.top; // height of client area | ||
int nClientWidth = rcDlg.right - rcDlg.left; // width of client area | ||
int nClientHeight = rcDlg.bottom - rcDlg.top; // height of client area |
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.
WM_SIZEメッセージは本来、第2パラメータにMAKELPARAM(cx,cy)
を受け取るので、
自前でGetClientRectを呼び出すのは無駄です。
https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-size
ウインドウ矩形とクライアント矩形の両方を使って処理したい場合には、 WM_WINDOWPOSCHANGEDメッセージのハンドラを書くんですが・・・この話はPRの内容と関係ないのでスルーしてよいかと思います。
ここの処理は SetWindowSubclass
で「表示位置を保存するウインドウのためのSubclassProc(≒WndProc)」を定義してあげると整理しやすくなるかもしれないです。いわゆるアスペクト指向っす。
リビルドしたら消えるように修正したほうがいいのかもです。 |
試しに
ただこの指定が適切なのかどうかはMSBuildを知らないのでよくわかりません。 |
レビューありがとうございました。マージします。 |
PR の目的
#1749 で指摘された補完候補一覧ダイアログに関する2件の不具合を修正します。
カテゴリ
PR の背景
PR のメリット
PR のデメリット (トレードオフとかあれば)
仕様・動作説明
前者の不具合について
補完候補一覧ダイアログの表示サイズは基底クラスから継承したメンバ変数に格納した値を利用しています。
sakura/sakura_core/CHokanMgr.cpp
Lines 241 to 244 in 0dd4391
これらの変数の値は、モニターワークエリアに収まるように調整された上でAPI関数
::MoveWindow()
に渡されます。このためにメンバ変数にダイアログサイズが記憶されていなければなりません。
以前は
CHokanMgr::DoModeless()
からCHokanMgr::OnSize()
を通じて呼び出されるCDialog::OnSize()
に当該処理が記述されていましたが、 #1711 で削除されたため、メンバ変数の値が基底クラスのコンストラクタで初期化されたままになっています。幸い、
CHokanMgr::DispatchEvent()
に記述されたWM_GETMINMAXINFOメッセージに対する処理によって下限値が設定されているため、それより小さい表示になることはありませんでした。対策として、
CDialog::OnSize()
から失われた当該処理をCHokanMgr::OnSize()
に追加します。なお、メンバ変数名と既存のローカル変数名が似ているうえ、それぞれスクリーン座標とクライアント座標で内容が異なることから、念のためローカル変数の名前を変更しました。
後者の不具合について
ApiWrap::List_GetText()
にて、格納先であるバッファのサイズを取得した文字列が収まるように調整する際、ヌル終端を含んだ値が必要な所に含まれない値を渡していたため、文字列が格納できていませんでした。渡している値はリストボックスのアイテムから文字列を取得するLB_GETTEXTメッセージの戻り値ですが、これは成功時にコピーできた文字列のヌル終端を含まない長さを返します。
対策として、ヌル終端を文字列の長さに加えたうえでサイズ調整を行うようにします。
また、単体テストを追加してList_GetTextの動作確認を実施しています。
PR の影響範囲
補完候補一覧ダイアログ (CHokanMgr)
テスト内容
手順
表示された候補一覧のサイズが小さすぎないか確認してください。
選択した候補が入力されることを確認してください。
関連 issue, PR
#1439 ... 問題②のきっかけ
#1711 ... 問題①のきっかけ
#1528 ... 類似案件
fixes #1749
参考資料