待辦事項 #45901

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

啟用日期: 2022-10-17 21:41 最後更新: 2022-10-20 22:07

回報者:
負責人:
類型:
狀態:
關閉
優先權:
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

Ticket History (3/5 Histories)

2022-10-17 21:41 Updated by: yknk
  • New Ticket "Win版 ウィンドウサイズがユーザ設定値より小さい" created
2022-10-17 22:11 Updated by: 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 Updated by: 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 Updated by: 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 Updated by: yknk
  • 狀態 Update from 開啟 to 關閉
  • 處理結果 Update from to 修正

Attachment File List

No attachments

編輯

Please login to add comment to this ticket » 登入