-
Notifications
You must be signed in to change notification settings - Fork 165
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
印刷ページ設定ダイアログのフォントが巨大化してしまう #1678
Comments
不具合現象からすると #1421 の変更が影響していそうな気がしていますので、後ほどその変更前の版で動作を見てみます。 |
ダイアログの処理を検証できる機構を準備したほうがいいんですかね。。。 ダイアログクラスCDialogにはもともと、できるだけWindows APIを使用しないための機構が存在していた形跡があります。GetData()とSetDataの機構がソレなんですけど、Getでダイアログからデータメンバにデータをコピーし、Setでデータをダイアログに反映しするようになっています。おそらくMFCのDDXを参考にした機構だと思うんですが、正しく使えばデータ処理とダイアログ画面を分離することができ「処理」の検証ができるようになります。なんか、Windows APIを直呼びしたい人が多かったみたいでgdgdになっちゃってますけどね。 何をどこまでやるか?ってのは考えていかなきゃならんです。
「OKを押下」したら、画面で選択したデータを確定して反映する処理が走ります。 まぁ、だからといってなんで巨大化すんねん!という部分は依然として謎なわけですが 😃 |
#1421 の修正で、ダイアログボックス自体のフォントハンドルを保持する変数※の初期化タイミングが変化しています。 #1421 反映前の初期化タイミング: CDlgPrintSetting.cpp
143:BOOL CDlgPrintSetting::OnInitDialog( HWND hwndDlg, WPARAM wParam, LPARAM lParam )
144:{
...
158: // ダイアログのフォントの取得
159: m_hFontDlg = (HFONT)::SendMessage( GetHwnd(), WM_GETFONT, 0, 0 ); ★ここだったものが……
160: LOGFONT lf;
161: ::GetObject(m_hFontDlg, sizeof(LOGFONT), &lf);
162: m_nFontHeight = lf.lfHeight; // フォントサイズ
163:
164: /* 基底クラスメンバ */
165: return CDialog::OnInitDialog( GetHwnd(), wParam, lParam ); 反映後の初期化タイミング: CDialog.cpp
176:BOOL CDialog::OnInitDialog( HWND hwndDlg, WPARAM wParam, LPARAM lParam )
177:{
...
182: /* ダイアログデータの設定 */
183: SetData();
184:
185: SetDialogPosSize();
186:
187: m_hFontDialog = UpdateDialogFont( hwndDlg ); ★ここに移動 (SetData よりも後という点がポイント)
188:
189: m_bInited = TRUE;
190: return TRUE;
191:} この変更が要因となって、「5. もう一度印刷ページ設定ダイアログを開く」の時に OnInitDialog -> SetData -> ... -> CDlgPrintSetting::SetFontName にてまだ初期化前の CDialog::m_hFontDialog (=NULL) を CDialog::GetDialogFont 経由で参照してしまう場合があり、その後意図しない動作になっているようです。 もう少し調査して原因・対策が分かってきましたら PR 作成します。 |
フォントサイズがおかしくなるまでの流れが分かってきました。
CDialog.cpp
176:BOOL CDialog::OnInitDialog( HWND hwndDlg, WPARAM wParam, LPARAM lParam )
...
182: /* ダイアログデータの設定 */
183: SetData();
...
187: m_hFontDialog = UpdateDialogFont( hwndDlg );
CDlgPrintSetting.cpp
896:void CDlgPrintSetting::SetFontName( int idTxt, int idUse, LOGFONT& lf, int nPointSize )
...
★ダイアログボックスのフォントが取れる(この時点では「MS Pゴシック」)
908: HFONT hFontOld = (HFONT)::SendMessage(GetItemHwnd( idTxt ), WM_GETFONT, 0, 0 );
909:
910: // 論理フォントを作成
911: HFONT hFont = ::CreateFontIndirect( &lft );
912: if (hFont) {
913: // フォントの設定
914: ::SendMessage( GetItemHwnd( idTxt ), WM_SETFONT, (WPARAM)hFont, MAKELPARAM(FALSE, 0) );
915: }
916: if (GetDialogFont() != hFontOld) { ★この時点ではGetDialogFontはNULLを返却→「真」
917: // 古いフォントの破棄
918: ::DeleteObject( hFontOld ); ★ダイアログボックスのフォントなのに誤って破棄
919: }
920:
window.cpp
388:HFONT UpdateDialogFont( HWND hwnd )
★先ほど破棄したフォントハンドルが取れる
390: HFONT hFontDialog = (HFONT)::SendMessageAny( hwnd, WM_GETFONT, 0, (LPARAM)NULL );
...
396: // 現在設定済みフォントと同じ高さのシステムフォント風フォントを得て再設定
397: LOGFONT lfDialog = {};
★フォントハンドル破棄済みのため情報取得に失敗。lfDialogの全メンバは初期値の 0 のまま。
398: GetObject( hFontDialog, sizeof( lfDialog ), &lfDialog );
★高さ0指定でシステムフォント相当のフォントを作成しようとする。
399: HFONT hFontSystemBased = GetSystemBasedFont( lfDialog.lfHeight ); まだフォントが「大きく」なってしまう理由がはっきりしていないのですが、LOGFONT 構造体の説明によると lfHeight = 0 の場合には「デフォルト」のフォントサイズが使われるとされていて、これが不具合発生時に見えているフォントの大きさなのかもしれません。 |
見てみましたが呼出し順がおかしいですね。 sakura/sakura_core/dlg/CDialog.cpp Lines 182 to 197 in 81f08b1
189行目のSetData()がダイアログ項目へのデータセット(≒描画)を行うので、 |
#1682 がマージされましたのでクローズします。 |
問題内容
不具合再現時のスクリーンショットです。
※印刷ページ設定ダイアログの配置調整作業中に偶然発見してしまいました。
再現手順
不具合発生後、「『使用』のチェックを外す」→「一旦ダイアログを閉じる」→「再度表示する」で正常に戻ります。
再現頻度
100% 起こせました。
問題のカテゴリ
環境情報
OS バージョン
Windows 10 Home 64bit
サクラエディタバージョン
※ひとまず1週ほど前のこの版で試しましたが、他の版ではまだ試せていません。
スクリーンショット
The text was updated successfully, but these errors were encountered: