OSDN Ticket Archive


Ticket #45901

Win版 ウィンドウサイズがユーザ設定値より小さい

登録: 2022-10-17 21:41 最終更新: 2022-10-20 22:07

報告者:
yknk
担当者:
yknk
チケットの種類:
バグ
状況:
完了
コンポーネント:
MIDITrail Ver.1.4.x for Windows
マイルストーン:
Version 1.4.0 for Windows (完了済み)
優先度:
5 - 中
重要度:
5 - 中
解決法:
修正済み
ファイル:
なし

詳細

MIDITrailのウィンドウサイズがユーザ設定値より小さい。 ウィンドウサイズ設定ダイアログでウィンドウサイズを800 x 600にしていても、 実際のサイズは786 x 593となり、横が-14、縦が-7の偏差がある。

ユーザ設定値と実際のウィンドウサイズ
テスト環境:Windows10
800 x 600  → 786 x 593  偏差 -14,-7
1280 x 800 → 1266 x 793 偏差 -14,-7

チケットの履歴

2022-10-17 21:41 更新者: yknk
  • 新しいチケット "Win版 ウィンドウサイズがユーザ設定値より小さい" が作成されました
2022-10-17 22:11 更新者: yknk
コメント

原因

ウィンドウサイズを変更する処理(MIDITrailApp::_SetWindowSize)において、 Windows Vista以降のOSの仕様変更に追随できていなかった。

従来のウィンドウサイズ変更処理

  • (1) GetWindowRectを用いて現状のウィンドウサイズを取得
  • (2) GetClientRectを用いて現状のクライアント領域のサイズを取得
  • (3) 描画領域にユーザ設定サイズを適用する場合は、(1)(2)から算出した枠のサイズをウィンドウサイズに加算
  • (4) SetWindowPosを用いてウィンドウサイズを変更

Windows Vista以降において、GetWindowRectは影を含むサイズを返すようになった。 またSetWindowPosで指定するウィンドウサイズは、影を含むサイズを期待されるようになった。

(4)でユーザ設定サイズをSetWindowPosに渡していたが、影を含むサイズとして扱われるため、 実際のウィンドウサイズはユーザ設定サイズより小さくなった。

描画領域にユーザ設定サイズを適用する場合は、(3)で算出した枠のサイズが影を含むため、 正しいサイズで表示されていた。

MIDITrailの初期バージョンは、Windows XPで開発していたため、OSの仕様変更に気づいていなかった。

不具合発生条件

以下の条件をすべて満たすと、ウィンドウサイズがユーザ設定値よりも小さくなる。

  • ウィンドウサイズ設定画面で"Apply to the view area"のチェックを外している場合
  • Windows Vista以降の場合 → MIDITrailのサポート対象OS(Windows 7/8/10/11)はすべて該当
2022-10-17 22:12 更新者: yknk
コメント

対策概要

SetWindowPosに対して影を含むウィンドウサイズを指定する。 またDwmGetWindowAttributeを用いて影を含まないウィンドウサイズを取得し、ウィンドウ枠のサイズを正しく算出する。

  • (1) DwmGetWindowAttributeを用いて現状のウィンドウサイズ(影を含まない)を取得
  • (2) GetClientRectを用いて現状のクライアント領域のサイズを取得
  • (3) 描画領域にユーザ設定サイズを適用する場合は、(1)(2)から算出した枠のサイズをウィンドウサイズに加算
  • (4) GetWindowRectを用いて現状のウィンドウサイズ(影を含む)を取得
  • (5) (1)(4)から影のサイズを算出
  • (6) SetWindowPosに影のサイズを含むウィンドウサイズを指定

対策

MIDITrailApp

  • DwmGetWindowAttributeを利用するため、dwmapi.h をインクルードに追加。

MIDITrailApp::_CreateWindow

  • ウィンドウ表示処理をウィンドウサイズ変更処理の前に移動。ウィンドウを表示してからでないと影の情報を取得できないため。

MIDITrailApp::_SetWindowSize

  • 対策概要の修正を反映。

MIDITrailプロジェクトプロパティ

  • Dwmapi.lib へのリンク設定を追加。「構成プロパティ / リンカー / すべてのオプション / 追加の依存ファイル」
2022-10-17 22:15 更新者: yknk
コメント

参考情報

Both MoveWindow and SetWindowPos result in incorrect window position/size
https://stackoverflow.com/questions/65599491/both-movewindow-and-setwindowpos-result-in-incorrect-window-position-size
2022-10-20 22:07 更新者: yknk
  • 状況オープン から 完了 に更新されました
  • 解決法なし から 修正済み に更新されました

添付ファイルリスト

添付ファイルはありません